ngx-material-entity 0.1.4 → 0.1.5

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 (130) hide show
  1. package/capsulation/lodash.utilities.d.ts +62 -0
  2. package/capsulation/reflect.utilities.d.ts +56 -0
  3. package/classes/base.builder.d.ts +2 -1
  4. package/classes/date.utilities.d.ts +16 -4
  5. package/classes/entity.model.d.ts +7 -1
  6. package/classes/entity.service.d.ts +38 -1
  7. package/classes/entity.utilities.d.ts +43 -16
  8. package/classes/file.utilities.d.ts +52 -0
  9. package/components/input/add-array-item-dialog-data.builder.d.ts +3 -2
  10. package/components/input/add-array-item-dialog-data.d.ts +2 -1
  11. package/components/input/array/array-date-input/array-date-input.component.d.ts +22 -0
  12. package/components/input/array/array-date-range-input/array-date-range-input.component.d.ts +30 -0
  13. package/components/input/array/array-date-time-input/array-date-time-input.component.d.ts +32 -0
  14. package/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.d.ts +58 -0
  15. package/components/input/array/array-string-chips-input/array-string-chips-input.component.d.ts +51 -0
  16. package/components/input/array/array-table.class.d.ts +48 -0
  17. package/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.d.ts +17 -0
  18. package/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.d.ts +17 -0
  19. package/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.d.ts +17 -0
  20. package/components/input/date/date-input/date-input.component.d.ts +21 -0
  21. package/components/input/date/date-range-input/date-range-input.component.d.ts +27 -0
  22. package/components/input/date/date-time-input/date-time-input.component.d.ts +38 -0
  23. package/components/input/file/file-default-input/file-default-input.component.d.ts +21 -0
  24. package/components/input/file/file-image-input/file-image-input.component.d.ts +30 -0
  25. package/components/input/file/file-input/dragDrop.directive.d.ts +32 -0
  26. package/components/input/file/file-input/file-input.component.d.ts +32 -0
  27. package/components/input/input.component.d.ts +37 -92
  28. package/components/input/input.module.d.ts +37 -16
  29. package/components/input/number/number-dropdown-input/number-dropdown-input.component.d.ts +17 -0
  30. package/components/input/number/number-input/number-input.component.d.ts +17 -0
  31. package/components/input/string/string-autocomplete-input/string-autocomplete-input.component.d.ts +25 -0
  32. package/components/input/string/string-dropdown-input/string-dropdown-input.component.d.ts +17 -0
  33. package/components/input/string/string-input/string-input.component.d.ts +17 -0
  34. package/components/input/string/string-textbox-input/string-textbox-input.component.d.ts +17 -0
  35. package/components/table/create-dialog/create-entity-dialog-data.builder.d.ts +3 -2
  36. package/components/table/create-dialog/create-entity-dialog-data.d.ts +2 -1
  37. package/components/table/create-dialog/create-entity-dialog.component.d.ts +7 -2
  38. package/components/table/edit-dialog/edit-dialog-data.builder.d.ts +3 -2
  39. package/components/table/edit-dialog/edit-entity-dialog-data.d.ts +2 -1
  40. package/components/table/edit-dialog/edit-entity-dialog.builder.d.ts +3 -2
  41. package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +5 -2
  42. package/components/table/table-data.builder.d.ts +5 -5
  43. package/components/table/table-data.d.ts +6 -6
  44. package/components/table/table.component.d.ts +2 -1
  45. package/decorators/array/array-decorator-internal.data.d.ts +71 -6
  46. package/decorators/array/array-decorator.data.d.ts +178 -12
  47. package/decorators/array/array.decorator.d.ts +3 -2
  48. package/decorators/base/base-property.decorator.d.ts +2 -3
  49. package/decorators/base/decorator-types.enum.d.ts +9 -3
  50. package/decorators/date/date-decorator-internal.data.d.ts +2 -2
  51. package/decorators/date/date.decorator.d.ts +8 -0
  52. package/decorators/file/file-decorator-internal.data.d.ts +92 -0
  53. package/decorators/file/file-decorator.data.d.ts +92 -0
  54. package/decorators/file/file.decorator.d.ts +9 -0
  55. package/decorators/object/object-decorator-internal.data.d.ts +2 -2
  56. package/decorators/object/object-decorator.data.d.ts +3 -3
  57. package/decorators/object/object.decorator.d.ts +2 -1
  58. package/esm2020/capsulation/lodash.utilities.mjs +75 -0
  59. package/esm2020/capsulation/reflect.utilities.mjs +69 -0
  60. package/esm2020/classes/base.builder.mjs +2 -3
  61. package/esm2020/classes/date.utilities.mjs +33 -13
  62. package/esm2020/classes/entity.model.mjs +1 -1
  63. package/esm2020/classes/entity.service.mjs +103 -6
  64. package/esm2020/classes/entity.utilities.mjs +202 -71
  65. package/esm2020/classes/file.utilities.mjs +123 -0
  66. package/esm2020/components/confirm-dialog/confirm-dialog-data.builder.mjs +4 -4
  67. package/esm2020/components/confirm-dialog/confirm-dialog.component.mjs +3 -3
  68. package/esm2020/components/input/add-array-item-dialog-data.builder.mjs +2 -2
  69. package/esm2020/components/input/add-array-item-dialog-data.mjs +1 -1
  70. package/esm2020/components/input/array/array-date-input/array-date-input.component.mjs +44 -0
  71. package/esm2020/components/input/array/array-date-range-input/array-date-range-input.component.mjs +68 -0
  72. package/esm2020/components/input/array/array-date-time-input/array-date-time-input.component.mjs +65 -0
  73. package/esm2020/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +131 -0
  74. package/esm2020/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +116 -0
  75. package/esm2020/components/input/array/array-table.class.mjs +92 -0
  76. package/esm2020/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +38 -0
  77. package/esm2020/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +35 -0
  78. package/esm2020/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +38 -0
  79. package/esm2020/components/input/date/date-input/date-input.component.mjs +38 -0
  80. package/esm2020/components/input/date/date-range-input/date-range-input.component.mjs +63 -0
  81. package/esm2020/components/input/date/date-time-input/date-time-input.component.mjs +74 -0
  82. package/esm2020/components/input/file/file-default-input/file-default-input.component.mjs +39 -0
  83. package/esm2020/components/input/file/file-image-input/file-image-input.component.mjs +95 -0
  84. package/esm2020/components/input/file/file-input/dragDrop.directive.mjs +64 -0
  85. package/esm2020/components/input/file/file-input/file-input.component.mjs +152 -0
  86. package/esm2020/components/input/input.component.mjs +124 -234
  87. package/esm2020/components/input/input.module.mjs +66 -3
  88. package/esm2020/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +36 -0
  89. package/esm2020/components/input/number/number-input/number-input.component.mjs +34 -0
  90. package/esm2020/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +52 -0
  91. package/esm2020/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +36 -0
  92. package/esm2020/components/input/string/string-input/string-input.component.mjs +34 -0
  93. package/esm2020/components/input/string/string-textbox-input/string-textbox-input.component.mjs +35 -0
  94. package/esm2020/components/table/create-dialog/create-dialog-data.builder.mjs +2 -2
  95. package/esm2020/components/table/create-dialog/create-entity-dialog-data.builder.mjs +1 -1
  96. package/esm2020/components/table/create-dialog/create-entity-dialog-data.mjs +1 -1
  97. package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +15 -8
  98. package/esm2020/components/table/edit-dialog/edit-dialog-data.builder.mjs +2 -2
  99. package/esm2020/components/table/edit-dialog/edit-entity-dialog-data.mjs +1 -1
  100. package/esm2020/components/table/edit-dialog/edit-entity-dialog.builder.mjs +2 -2
  101. package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +18 -10
  102. package/esm2020/components/table/table-data.builder.mjs +3 -3
  103. package/esm2020/components/table/table-data.mjs +1 -1
  104. package/esm2020/components/table/table.component.mjs +21 -23
  105. package/esm2020/decorators/array/array-decorator-internal.data.mjs +102 -14
  106. package/esm2020/decorators/array/array-decorator.data.mjs +2 -2
  107. package/esm2020/decorators/array/array.decorator.mjs +8 -2
  108. package/esm2020/decorators/base/base-property.decorator.mjs +4 -3
  109. package/esm2020/decorators/base/decorator-types.enum.mjs +6 -1
  110. package/esm2020/decorators/base/property-decorator-internal.data.mjs +10 -10
  111. package/esm2020/decorators/base/property-decorator.data.mjs +1 -1
  112. package/esm2020/decorators/boolean/boolean-decorator-internal.data.mjs +3 -3
  113. package/esm2020/decorators/date/date-decorator-internal.data.mjs +5 -5
  114. package/esm2020/decorators/date/date.decorator.mjs +21 -0
  115. package/esm2020/decorators/file/file-decorator-internal.data.mjs +98 -0
  116. package/esm2020/decorators/file/file-decorator.data.mjs +7 -0
  117. package/esm2020/decorators/file/file.decorator.mjs +22 -0
  118. package/esm2020/decorators/object/object-decorator-internal.data.mjs +1 -1
  119. package/esm2020/decorators/object/object-decorator.data.mjs +1 -1
  120. package/esm2020/decorators/object/object.decorator.mjs +1 -1
  121. package/esm2020/decorators/string/string.decorator.mjs +1 -1
  122. package/esm2020/mocks/placeholder-data.png.mjs +3 -0
  123. package/esm2020/public-api.mjs +6 -1
  124. package/fesm2015/ngx-material-entity.mjs +2452 -459
  125. package/fesm2015/ngx-material-entity.mjs.map +1 -1
  126. package/fesm2020/ngx-material-entity.mjs +2370 -464
  127. package/fesm2020/ngx-material-entity.mjs.map +1 -1
  128. package/mocks/placeholder-data.png.d.ts +1 -0
  129. package/package.json +1 -1
  130. package/public-api.d.ts +5 -0
@@ -1,6 +1,8 @@
1
1
  import { BehaviorSubject, firstValueFrom } from 'rxjs';
2
- import { isNil, omit, omitBy } from 'lodash';
3
2
  import { EntityUtilities } from './entity.utilities';
3
+ import { LodashUtilities } from '../capsulation/lodash.utilities';
4
+ import { DecoratorTypes } from '../decorators/base/decorator-types.enum';
5
+ import { FileUtilities } from './file.utilities';
4
6
  /**
5
7
  * A generic EntityService class.
6
8
  * Offers basic CRUD-functionality.
@@ -38,7 +40,54 @@ export class EntityService {
38
40
  * @returns A Promise of the created entity.
39
41
  */
40
42
  async create(entity) {
41
- const body = omit(entity, EntityUtilities.getOmitForCreate(entity));
43
+ const body = LodashUtilities.omit(entity, EntityUtilities.getOmitForCreate(entity));
44
+ const filePropertyKeys = EntityUtilities.getFileProperties(entity);
45
+ if (!filePropertyKeys.length) {
46
+ return await this.createWithJson(body);
47
+ }
48
+ else {
49
+ return await this.createWithFormData(body, filePropertyKeys, entity);
50
+ }
51
+ }
52
+ // TODO: Find a way to use blobs with jest
53
+ /* istanbul ignore next */
54
+ /**
55
+ * Creates the entity with form data when the entity contains files in contrast to creating it with a normal json body.
56
+ * All file values are stored inside their respective property key and their name.
57
+ * Form data is able to handle setting multiple files to the same key.
58
+ *
59
+ * @param body - The body Of the request.
60
+ * @param filePropertyKeys - All property keys that are files and need to be added to the form data.
61
+ * @param entity - The entity to create. This is needed in addition to the body because the body doesn't contain any metadata.
62
+ * @returns The created entity from the server.
63
+ */
64
+ async createWithFormData(body, filePropertyKeys, entity) {
65
+ const formData = new FormData();
66
+ formData.append('body', JSON.stringify(LodashUtilities.omit(body, filePropertyKeys)));
67
+ for (const key of filePropertyKeys) {
68
+ if (EntityUtilities.getPropertyMetadata(entity, key, DecoratorTypes.FILE_DEFAULT).multiple) {
69
+ const fileDataValues = body[key];
70
+ for (const value of fileDataValues) {
71
+ formData.append(key, (await FileUtilities.getFileData(value)).file, value.name);
72
+ }
73
+ }
74
+ else {
75
+ const fileData = body[key];
76
+ formData.append(key, (await FileUtilities.getFileData(fileData)).file, fileData.name);
77
+ }
78
+ }
79
+ const e = await firstValueFrom(this.http.post(this.baseUrl, formData));
80
+ this.entities.push(e);
81
+ this.entitiesSubject.next(this.entities);
82
+ return e;
83
+ }
84
+ /**
85
+ * Creates the entity with a normal json body in contrast to creating it with form data when the entity contains files.
86
+ *
87
+ * @param body - The body Of the request.
88
+ * @returns The created entity from the server.
89
+ */
90
+ async createWithJson(body) {
42
91
  const e = await firstValueFrom(this.http.post(this.baseUrl, body));
43
92
  this.entities.push(e);
44
93
  this.entitiesSubject.next(this.entities);
@@ -63,9 +112,57 @@ export class EntityService {
63
112
  * It Is used to get changed values and only update them instead of sending the whole entity data.
64
113
  */
65
114
  async update(entity, entityPriorChanges) {
66
- const reqBody = omit(EntityUtilities.difference(entity, entityPriorChanges), EntityUtilities.getOmitForUpdate(entity));
67
- const updatedEntity = await firstValueFrom(this.http.patch(`${this.baseUrl}/${entityPriorChanges[this.idKey]}`, omitBy(reqBody, isNil)));
68
- this.entities[this.entities.findIndex(e => e[this.idKey] === entityPriorChanges[this.idKey])] = updatedEntity;
115
+ const body = LodashUtilities.omit(await EntityUtilities.difference(entity, entityPriorChanges), EntityUtilities.getOmitForUpdate(entity));
116
+ const filePropertyKeys = EntityUtilities.getFileProperties(entityPriorChanges);
117
+ if (!filePropertyKeys.length) {
118
+ await this.updateWithJson(body, entityPriorChanges[this.idKey]);
119
+ }
120
+ else {
121
+ await this.updateWithFormData(body, filePropertyKeys, entity, entityPriorChanges[this.idKey]);
122
+ }
123
+ }
124
+ // TODO: Find a way to use blobs with jest
125
+ /* istanbul ignore next */
126
+ /**
127
+ * Updates the entity with form data when the entity contains files in contrast to creating it with a normal json body.
128
+ * All file values are stored inside their respective property key and their name.
129
+ * Form data is able to handle setting multiple files to the same key.
130
+ *
131
+ * @param body - The request body. Already contains only properties that have changed.
132
+ * @param filePropertyKeys - The keys of all properties which are files and need to separately be appended to the form data.
133
+ * @param entity - The original entity. Is needed to get the metadata of all the files.
134
+ * @param id - The id of the entity to update.
135
+ */
136
+ async updateWithFormData(body, filePropertyKeys, entity, id) {
137
+ const formData = new FormData();
138
+ formData.append('body', JSON.stringify(LodashUtilities.omitBy(body, LodashUtilities.isNil)));
139
+ for (const key of filePropertyKeys) {
140
+ if (EntityUtilities.getPropertyMetadata(entity, key, DecoratorTypes.FILE_DEFAULT).multiple) {
141
+ // eslint-disable-next-line max-len
142
+ const fileDataValues = body[key];
143
+ for (const value of fileDataValues) {
144
+ formData.append(key, (await FileUtilities.getFileData(value)).file, value.name);
145
+ }
146
+ }
147
+ else {
148
+ // eslint-disable-next-line max-len
149
+ const fileData = body[key];
150
+ formData.append(key, (await FileUtilities.getFileData(fileData)).file, fileData.name);
151
+ }
152
+ }
153
+ const updatedEntity = await firstValueFrom(this.http.patch(`${this.baseUrl}/${id}`, formData));
154
+ this.entities[this.entities.findIndex(e => e[this.idKey] === id)] = updatedEntity;
155
+ this.entitiesSubject.next(this.entities);
156
+ }
157
+ /**
158
+ * Updates the entity with a normal json body in contrast to updating it with form data when the entity contains files.
159
+ *
160
+ * @param body - The body of the Request. Has already removed all unnecessary values.
161
+ * @param id - The id of the entity to update.
162
+ */
163
+ async updateWithJson(body, id) {
164
+ const updatedEntity = await firstValueFrom(this.http.patch(`${this.baseUrl}/${id}`, LodashUtilities.omitBy(body, LodashUtilities.isNil)));
165
+ this.entities[this.entities.findIndex(e => e[this.idKey] === id)] = updatedEntity;
69
166
  this.entitiesSubject.next(this.entities);
70
167
  }
71
168
  /**
@@ -80,4 +177,4 @@ export class EntityService {
80
177
  this.entitiesSubject.next(this.entities);
81
178
  }
82
179
  }
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jbGFzc2VzL2VudGl0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFckQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQWdCLGFBQWE7SUFvQy9CLFlBQTZCLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUF0QjdDOzs7O1dBSUc7UUFDTSxVQUFLLEdBQXFCLElBQXdCLENBQUM7UUFFNUQ7OztXQUdHO1FBQ00sb0JBQWUsR0FBa0MsSUFBSSxlQUFlLENBQWUsRUFBRSxDQUFDLENBQUM7SUFXaEQsQ0FBQztJQVRqRDs7OztPQUlHO0lBQ0gsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztJQUN0QyxDQUFDO0lBSUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFrQjtRQUMzQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFhLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxJQUFJO1FBQ04sTUFBTSxDQUFDLEdBQUcsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBa0IsRUFBRSxrQkFBOEI7UUFDM0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUNoQixlQUFlLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxFQUN0RCxlQUFlLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQzNDLENBQUM7UUFDRixNQUFNLGFBQWEsR0FBRyxNQUFNLGNBQWMsQ0FDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQ1gsR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUNuRCxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUN6QixDQUNKLENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQztRQUM5RyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQWtCO1FBQzNCLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaXNOaWwsIG9taXQsIG9taXRCeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBFbnRpdHlVdGlsaXRpZXMgfSBmcm9tICcuL2VudGl0eS51dGlsaXRpZXMnO1xuXG4vKipcbiAqIEEgZ2VuZXJpYyBFbnRpdHlTZXJ2aWNlIGNsYXNzLlxuICogT2ZmZXJzIGJhc2ljIENSVUQtZnVuY3Rpb25hbGl0eS5cbiAqIFlvdSBzaG91bGQgY3JlYXRlIGEgc2VydmljZSBmb3IgZXZlcnkgRW50aXR5IHlvdSBoYXZlLlxuICogSWYgeW91IGV4dGVuZCBmcm9tIHRoaXMgeW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGV4dGVuZGVkIFNlcnZpY2UgY2FuIGJlIGluamVjdGVkLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRW50aXR5U2VydmljZTxFbnRpdHlUeXBlIGV4dGVuZHMgb2JqZWN0PiB7XG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgdXJsIHVzZWQgZm9yIGFwaSByZXF1ZXN0cy4gSWYgdSB3YW50IHRvIGhhdmUgbW9yZSBjb250cm9sIG92ZXIgdGhpcyxcbiAgICAgKiB5b3UgY2FuIG92ZXJyaWRlIHRoZSBjcmVhdGUsIHJlYWQsIHVwZGF0ZSBhbmQgZGVsZXRlIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgU2VuZHMgYSBQT1NULVJlcXVlc3QgdG8gYmFzZVVybC5cbiAgICAgKlxuICAgICAqIFJlYWQgU2VuZHMgYSBHRVQtUmVxdWVzdCB0byBiYXNlVXJsLlxuICAgICAqXG4gICAgICogVXBkYXRlIFNlbmRzIGEgUEFUQ0gtUmVxdWVzdCB0byBiYXNlVXJsL3tpZH0uXG4gICAgICpcbiAgICAgKiBEZWxldGUgU2VuZHMgYSBERUwtUmVxdWVzdCB0byBiYXNlVXJsL3tpZH0uXG4gICAgICovXG4gICAgYWJzdHJhY3QgcmVhZG9ubHkgYmFzZVVybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgd2hpY2ggaG9sZHMgdGhlIGlkIHZhbHVlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgJ2lkJ1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkS2V5OiBrZXlvZiBFbnRpdHlUeXBlID0gJ2lkJyBhcyBrZXlvZiBFbnRpdHlUeXBlO1xuXG4gICAgLyoqXG4gICAgICogQSBzdWJqZWN0IG9mIGFsbCB0aGUgZW50aXR5IHZhbHVlcy5cbiAgICAgKiBDYW4gYmUgc3Vic2NyaWJlZCB0byB3aGVuIHlvdSB3YW50IHRvIGRvIGEgc3BlY2lmaWMgdGhpbmcgd2hlbmV2ZXIgdGhlIGVudGl0aWVzIGNoYW5nZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbnRpdGllc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxFbnRpdHlUeXBlW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFbnRpdHlUeXBlW10+KFtdKTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVudGl0aWVzIGluIGFuIGFycmF5IGZyb20gdGhlIGludGVybmFsIGVudGl0aWVzU3ViamVjdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGVudGl0aWVzIGluIGZvcm0gb2YgYW4gYXJyYXkuXG4gICAgICovXG4gICAgZ2V0IGVudGl0aWVzKCk6IEVudGl0eVR5cGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudGl0aWVzU3ViamVjdC52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQpIHt9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEVudGl0eSBhbmQgcHVzaGVzIGl0IHRvIHRoZSBlbnRpdGllcyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZGF0YSBvZiB0aGUgZW50aXR5IHRvIGNyZWF0ZS5cbiAgICAgKiBBbGwgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIG9taXR0ZWQgd2lsbCBiZSByZW1vdmVkIGZyb20gaXQgaW5zaWRlIHRoaXMgbWV0aG9kLlxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSBvZiB0aGUgY3JlYXRlZCBlbnRpdHkuXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlKGVudGl0eTogRW50aXR5VHlwZSk6IFByb21pc2U8RW50aXR5VHlwZT4ge1xuICAgICAgICBjb25zdCBib2R5ID0gb21pdChlbnRpdHksIEVudGl0eVV0aWxpdGllcy5nZXRPbWl0Rm9yQ3JlYXRlKGVudGl0eSkpO1xuICAgICAgICBjb25zdCBlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5odHRwLnBvc3Q8RW50aXR5VHlwZT4odGhpcy5iYXNlVXJsLCBib2R5KSk7XG4gICAgICAgIHRoaXMuZW50aXRpZXMucHVzaChlKTtcbiAgICAgICAgdGhpcy5lbnRpdGllc1N1YmplY3QubmV4dCh0aGlzLmVudGl0aWVzKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgZXhpc3RpbmcgZW50aXRpZXMgYW5kIHB1c2hlcyB0aGVtIHRvIHRoZSBlbnRpdGllcyBhcnJheS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSBvZiBhbGwgcmVjZWl2ZWQgRW50aXRpZXMuXG4gICAgICovXG4gICAgYXN5bmMgcmVhZCgpOiBQcm9taXNlPEVudGl0eVR5cGVbXT4ge1xuICAgICAgICBjb25zdCBlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5odHRwLmdldDxFbnRpdHlUeXBlW10+KHRoaXMuYmFzZVVybCkpO1xuICAgICAgICB0aGlzLmVudGl0aWVzU3ViamVjdC5uZXh0KGUpO1xuICAgICAgICByZXR1cm4gZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGEgc3BlY2lmaWMgRW50aXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSB1cGRhdGVkIEVudGl0eVxuICAgICAqIEFsbCB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgb21pdHRlZCB3aWxsIGJlIHJlbW92ZWQgZnJvbSBpdCBpbnNpZGUgdGhpcyBtZXRob2QuXG4gICAgICogQHBhcmFtIGVudGl0eVByaW9yQ2hhbmdlcyAtIFRoZSBjdXJyZW50IEVudGl0eS5cbiAgICAgKiBJdCBJcyB1c2VkIHRvIGdldCBjaGFuZ2VkIHZhbHVlcyBhbmQgb25seSB1cGRhdGUgdGhlbSBpbnN0ZWFkIG9mIHNlbmRpbmcgdGhlIHdob2xlIGVudGl0eSBkYXRhLlxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZShlbnRpdHk6IEVudGl0eVR5cGUsIGVudGl0eVByaW9yQ2hhbmdlczogRW50aXR5VHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCByZXFCb2R5ID0gb21pdChcbiAgICAgICAgICAgIEVudGl0eVV0aWxpdGllcy5kaWZmZXJlbmNlKGVudGl0eSwgZW50aXR5UHJpb3JDaGFuZ2VzKSxcbiAgICAgICAgICAgIEVudGl0eVV0aWxpdGllcy5nZXRPbWl0Rm9yVXBkYXRlKGVudGl0eSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdXBkYXRlZEVudGl0eSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgICAgdGhpcy5odHRwLnBhdGNoPEVudGl0eVR5cGU+KFxuICAgICAgICAgICAgICAgIGAke3RoaXMuYmFzZVVybH0vJHtlbnRpdHlQcmlvckNoYW5nZXNbdGhpcy5pZEtleV19YCxcbiAgICAgICAgICAgICAgICBvbWl0QnkocmVxQm9keSwgaXNOaWwpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZW50aXRpZXNbdGhpcy5lbnRpdGllcy5maW5kSW5kZXgoZSA9PiBlW3RoaXMuaWRLZXldID09PSBlbnRpdHlQcmlvckNoYW5nZXNbdGhpcy5pZEtleV0pXSA9IHVwZGF0ZWRFbnRpdHk7XG4gICAgICAgIHRoaXMuZW50aXRpZXNTdWJqZWN0Lm5leHQodGhpcy5lbnRpdGllcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBhIHNwZWNpZmljIEVudGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGRlbGV0ZS5cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGUoZW50aXR5OiBFbnRpdHlUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuaHR0cC5kZWxldGU8dm9pZD4oYCR7dGhpcy5iYXNlVXJsfS8ke2VudGl0eVt0aGlzLmlkS2V5XX1gKSk7XG4gICAgICAgIC8vIHRoZSA9PSBjb21wYXJpc29uIGluc3RlYWQgb2YgPT09IGlzIHRvIGNhdGNoIGlkcyB0aGF0IGFyZSBudW1iZXJzLlxuICAgICAgICB0aGlzLmVudGl0aWVzLnNwbGljZSh0aGlzLmVudGl0aWVzLmZpbmRJbmRleChlID0+IGVbdGhpcy5pZEtleV0gPT09IGVudGl0eVt0aGlzLmlkS2V5XSksIDEpO1xuICAgICAgICB0aGlzLmVudGl0aWVzU3ViamVjdC5uZXh0KHRoaXMuZW50aXRpZXMpO1xuICAgIH1cbn0iXX0=
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jbGFzc2VzL2VudGl0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUdqRDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBZ0IsYUFBYTtJQW9DL0IsWUFBNkIsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQXRCN0M7Ozs7V0FJRztRQUNNLFVBQUssR0FBcUIsSUFBd0IsQ0FBQztRQUU1RDs7O1dBR0c7UUFDTSxvQkFBZSxHQUFrQyxJQUFJLGVBQWUsQ0FBZSxFQUFFLENBQUMsQ0FBQztJQVdoRCxDQUFDO0lBVGpEOzs7O09BSUc7SUFDSCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO0lBQ3RDLENBQUM7SUFJRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQWtCO1FBQzNCLE1BQU0sSUFBSSxHQUF3QixlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQXdCLENBQUM7UUFDaEksTUFBTSxnQkFBZ0IsR0FBeUIsZUFBZSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7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LENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQztRQUNsRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQWtCO1FBQzNCLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRW50aXR5VXRpbGl0aWVzIH0gZnJvbSAnLi9lbnRpdHkudXRpbGl0aWVzJztcbmltcG9ydCB7IExvZGFzaFV0aWxpdGllcyB9IGZyb20gJy4uL2NhcHN1bGF0aW9uL2xvZGFzaC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgRGVjb3JhdG9yVHlwZXMgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2Jhc2UvZGVjb3JhdG9yLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgRmlsZURhdGEgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2ZpbGUvZmlsZS1kZWNvcmF0b3IuZGF0YSc7XG5pbXBvcnQgeyBGaWxlVXRpbGl0aWVzIH0gZnJvbSAnLi9maWxlLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBCYXNlRW50aXR5VHlwZSB9IGZyb20gJy4vZW50aXR5Lm1vZGVsJztcblxuLyoqXG4gKiBBIGdlbmVyaWMgRW50aXR5U2VydmljZSBjbGFzcy5cbiAqIE9mZmVycyBiYXNpYyBDUlVELWZ1bmN0aW9uYWxpdHkuXG4gKiBZb3Ugc2hvdWxkIGNyZWF0ZSBhIHNlcnZpY2UgZm9yIGV2ZXJ5IEVudGl0eSB5b3UgaGF2ZS5cbiAqIElmIHlvdSBleHRlbmQgZnJvbSB0aGlzIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBleHRlbmRlZCBTZXJ2aWNlIGNhbiBiZSBpbmplY3RlZC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEVudGl0eVNlcnZpY2U8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiB7XG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgdXJsIHVzZWQgZm9yIGFwaSByZXF1ZXN0cy4gSWYgdSB3YW50IHRvIGhhdmUgbW9yZSBjb250cm9sIG92ZXIgdGhpcyxcbiAgICAgKiB5b3UgY2FuIG92ZXJyaWRlIHRoZSBjcmVhdGUsIHJlYWQsIHVwZGF0ZSBhbmQgZGVsZXRlIG1ldGhvZHMuXG4gICAgICpcbiAgICAgKiBDcmVhdGUgU2VuZHMgYSBQT1NULVJlcXVlc3QgdG8gYmFzZVVybC5cbiAgICAgKlxuICAgICAqIFJlYWQgU2VuZHMgYSBHRVQtUmVxdWVzdCB0byBiYXNlVXJsLlxuICAgICAqXG4gICAgICogVXBkYXRlIFNlbmRzIGEgUEFUQ0gtUmVxdWVzdCB0byBiYXNlVXJsL3tpZH0uXG4gICAgICpcbiAgICAgKiBEZWxldGUgU2VuZHMgYSBERUwtUmVxdWVzdCB0byBiYXNlVXJsL3tpZH0uXG4gICAgICovXG4gICAgYWJzdHJhY3QgcmVhZG9ubHkgYmFzZVVybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgd2hpY2ggaG9sZHMgdGhlIGlkIHZhbHVlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgJ2lkJ1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkS2V5OiBrZXlvZiBFbnRpdHlUeXBlID0gJ2lkJyBhcyBrZXlvZiBFbnRpdHlUeXBlO1xuXG4gICAgLyoqXG4gICAgICogQSBzdWJqZWN0IG9mIGFsbCB0aGUgZW50aXR5IHZhbHVlcy5cbiAgICAgKiBDYW4gYmUgc3Vic2NyaWJlZCB0byB3aGVuIHlvdSB3YW50IHRvIGRvIGEgc3BlY2lmaWMgdGhpbmcgd2hlbmV2ZXIgdGhlIGVudGl0aWVzIGNoYW5nZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbnRpdGllc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxFbnRpdHlUeXBlW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFbnRpdHlUeXBlW10+KFtdKTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVudGl0aWVzIGluIGFuIGFycmF5IGZyb20gdGhlIGludGVybmFsIGVudGl0aWVzU3ViamVjdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGVudGl0aWVzIGluIGZvcm0gb2YgYW4gYXJyYXkuXG4gICAgICovXG4gICAgZ2V0IGVudGl0aWVzKCk6IEVudGl0eVR5cGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudGl0aWVzU3ViamVjdC52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQpIHt9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEVudGl0eSBhbmQgcHVzaGVzIGl0IHRvIHRoZSBlbnRpdGllcyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZGF0YSBvZiB0aGUgZW50aXR5IHRvIGNyZWF0ZS5cbiAgICAgKiBBbGwgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIG9taXR0ZWQgd2lsbCBiZSByZW1vdmVkIGZyb20gaXQgaW5zaWRlIHRoaXMgbWV0aG9kLlxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSBvZiB0aGUgY3JlYXRlZCBlbnRpdHkuXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlKGVudGl0eTogRW50aXR5VHlwZSk6IFByb21pc2U8RW50aXR5VHlwZT4ge1xuICAgICAgICBjb25zdCBib2R5OiBQYXJ0aWFsPEVudGl0eVR5cGU+ID0gTG9kYXNoVXRpbGl0aWVzLm9taXQoZW50aXR5LCBFbnRpdHlVdGlsaXRpZXMuZ2V0T21pdEZvckNyZWF0ZShlbnRpdHkpKSBhcyBQYXJ0aWFsPEVudGl0eVR5cGU+O1xuICAgICAgICBjb25zdCBmaWxlUHJvcGVydHlLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IEVudGl0eVV0aWxpdGllcy5nZXRGaWxlUHJvcGVydGllcyhlbnRpdHkpO1xuICAgICAgICBpZiAoIWZpbGVQcm9wZXJ0eUtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVXaXRoSnNvbihib2R5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZVdpdGhGb3JtRGF0YShib2R5LCBmaWxlUHJvcGVydHlLZXlzLCBlbnRpdHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogRmluZCBhIHdheSB0byB1c2UgYmxvYnMgd2l0aCBqZXN0XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBlbnRpdHkgd2l0aCBmb3JtIGRhdGEgd2hlbiB0aGUgZW50aXR5IGNvbnRhaW5zIGZpbGVzIGluIGNvbnRyYXN0IHRvIGNyZWF0aW5nIGl0IHdpdGggYSBub3JtYWwganNvbiBib2R5LlxuICAgICAqIEFsbCBmaWxlIHZhbHVlcyBhcmUgc3RvcmVkIGluc2lkZSB0aGVpciByZXNwZWN0aXZlIHByb3BlcnR5IGtleSBhbmQgdGhlaXIgbmFtZS5cbiAgICAgKiBGb3JtIGRhdGEgaXMgYWJsZSB0byBoYW5kbGUgc2V0dGluZyBtdWx0aXBsZSBmaWxlcyB0byB0aGUgc2FtZSBrZXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYm9keSAtIFRoZSBib2R5IE9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBmaWxlUHJvcGVydHlLZXlzIC0gQWxsIHByb3BlcnR5IGtleXMgdGhhdCBhcmUgZmlsZXMgYW5kIG5lZWQgdG8gYmUgYWRkZWQgdG8gdGhlIGZvcm0gZGF0YS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBjcmVhdGUuIFRoaXMgaXMgbmVlZGVkIGluIGFkZGl0aW9uIHRvIHRoZSBib2R5IGJlY2F1c2UgdGhlIGJvZHkgZG9lc24ndCBjb250YWluIGFueSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBlbnRpdHkgZnJvbSB0aGUgc2VydmVyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBjcmVhdGVXaXRoRm9ybURhdGEoXG4gICAgICAgIGJvZHk6IFBhcnRpYWw8RW50aXR5VHlwZT4sXG4gICAgICAgIGZpbGVQcm9wZXJ0eUtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdLFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGVcbiAgICApOiBQcm9taXNlPEVudGl0eVR5cGU+IHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdib2R5JywgSlNPTi5zdHJpbmdpZnkoTG9kYXNoVXRpbGl0aWVzLm9taXQoYm9keSwgZmlsZVByb3BlcnR5S2V5cykpKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZmlsZVByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgaWYgKEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5LCBEZWNvcmF0b3JUeXBlcy5GSUxFX0RFRkFVTFQpLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZURhdGFWYWx1ZXM6IEZpbGVEYXRhW10gPSBib2R5W2tleV0gYXMgRmlsZURhdGFbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGZpbGVEYXRhVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXkgYXMgc3RyaW5nLCAoYXdhaXQgRmlsZVV0aWxpdGllcy5nZXRGaWxlRGF0YSh2YWx1ZSkpLmZpbGUsIHZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVEYXRhOiBGaWxlRGF0YSA9IGJvZHlba2V5XSBhcyBGaWxlRGF0YTtcbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5IGFzIHN0cmluZywgKGF3YWl0IEZpbGVVdGlsaXRpZXMuZ2V0RmlsZURhdGEoZmlsZURhdGEpKS5maWxlLCBmaWxlRGF0YS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5odHRwLnBvc3Q8RW50aXR5VHlwZT4odGhpcy5iYXNlVXJsLCBmb3JtRGF0YSkpO1xuICAgICAgICB0aGlzLmVudGl0aWVzLnB1c2goZSk7XG4gICAgICAgIHRoaXMuZW50aXRpZXNTdWJqZWN0Lm5leHQodGhpcy5lbnRpdGllcyk7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGVudGl0eSB3aXRoIGEgbm9ybWFsIGpzb24gYm9keSBpbiBjb250cmFzdCB0byBjcmVhdGluZyBpdCB3aXRoIGZvcm0gZGF0YSB3aGVuIHRoZSBlbnRpdHkgY29udGFpbnMgZmlsZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYm9keSAtIFRoZSBib2R5IE9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGVudGl0eSBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZVdpdGhKc29uKGJvZHk6IFBhcnRpYWw8RW50aXR5VHlwZT4pOiBQcm9taXNlPEVudGl0eVR5cGU+IHtcbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuaHR0cC5wb3N0PEVudGl0eVR5cGU+KHRoaXMuYmFzZVVybCwgYm9keSkpO1xuICAgICAgICB0aGlzLmVudGl0aWVzLnB1c2goZSk7XG4gICAgICAgIHRoaXMuZW50aXRpZXNTdWJqZWN0Lm5leHQodGhpcy5lbnRpdGllcyk7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGV4aXN0aW5nIGVudGl0aWVzIGFuZCBwdXNoZXMgdGhlbSB0byB0aGUgZW50aXRpZXMgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2Ugb2YgYWxsIHJlY2VpdmVkIEVudGl0aWVzLlxuICAgICAqL1xuICAgIGFzeW5jIHJlYWQoKTogUHJvbWlzZTxFbnRpdHlUeXBlW10+IHtcbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuaHR0cC5nZXQ8RW50aXR5VHlwZVtdPih0aGlzLmJhc2VVcmwpKTtcbiAgICAgICAgdGhpcy5lbnRpdGllc1N1YmplY3QubmV4dChlKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBhIHNwZWNpZmljIEVudGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgdXBkYXRlZCBFbnRpdHlcbiAgICAgKiBBbGwgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIG9taXR0ZWQgd2lsbCBiZSByZW1vdmVkIGZyb20gaXQgaW5zaWRlIHRoaXMgbWV0aG9kLlxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgLSBUaGUgY3VycmVudCBFbnRpdHkuXG4gICAgICogSXQgSXMgdXNlZCB0byBnZXQgY2hhbmdlZCB2YWx1ZXMgYW5kIG9ubHkgdXBkYXRlIHRoZW0gaW5zdGVhZCBvZiBzZW5kaW5nIHRoZSB3aG9sZSBlbnRpdHkgZGF0YS5cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGUoZW50aXR5OiBFbnRpdHlUeXBlLCBlbnRpdHlQcmlvckNoYW5nZXM6IEVudGl0eVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYm9keTogUGFydGlhbDxFbnRpdHlUeXBlPiA9IExvZGFzaFV0aWxpdGllcy5vbWl0KFxuICAgICAgICAgICAgYXdhaXQgRW50aXR5VXRpbGl0aWVzLmRpZmZlcmVuY2UoZW50aXR5LCBlbnRpdHlQcmlvckNoYW5nZXMpLFxuICAgICAgICAgICAgRW50aXR5VXRpbGl0aWVzLmdldE9taXRGb3JVcGRhdGUoZW50aXR5KVxuICAgICAgICApIGFzIHVua25vd24gYXMgUGFydGlhbDxFbnRpdHlUeXBlPjtcbiAgICAgICAgY29uc3QgZmlsZVByb3BlcnR5S2V5cyA9IEVudGl0eVV0aWxpdGllcy5nZXRGaWxlUHJvcGVydGllcyhlbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICBpZiAoIWZpbGVQcm9wZXJ0eUtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVdpdGhKc29uKGJvZHksIGVudGl0eVByaW9yQ2hhbmdlc1t0aGlzLmlkS2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVdpdGhGb3JtRGF0YShib2R5LCBmaWxlUHJvcGVydHlLZXlzLCBlbnRpdHksIGVudGl0eVByaW9yQ2hhbmdlc1t0aGlzLmlkS2V5XSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBGaW5kIGEgd2F5IHRvIHVzZSBibG9icyB3aXRoIGplc3RcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGVudGl0eSB3aXRoIGZvcm0gZGF0YSB3aGVuIHRoZSBlbnRpdHkgY29udGFpbnMgZmlsZXMgaW4gY29udHJhc3QgdG8gY3JlYXRpbmcgaXQgd2l0aCBhIG5vcm1hbCBqc29uIGJvZHkuXG4gICAgICogQWxsIGZpbGUgdmFsdWVzIGFyZSBzdG9yZWQgaW5zaWRlIHRoZWlyIHJlc3BlY3RpdmUgcHJvcGVydHkga2V5IGFuZCB0aGVpciBuYW1lLlxuICAgICAqIEZvcm0gZGF0YSBpcyBhYmxlIHRvIGhhbmRsZSBzZXR0aW5nIG11bHRpcGxlIGZpbGVzIHRvIHRoZSBzYW1lIGtleS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBib2R5IC0gVGhlIHJlcXVlc3QgYm9keS4gQWxyZWFkeSBjb250YWlucyBvbmx5IHByb3BlcnRpZXMgdGhhdCBoYXZlIGNoYW5nZWQuXG4gICAgICogQHBhcmFtIGZpbGVQcm9wZXJ0eUtleXMgLSBUaGUga2V5cyBvZiBhbGwgcHJvcGVydGllcyB3aGljaCBhcmUgZmlsZXMgYW5kIG5lZWQgdG8gc2VwYXJhdGVseSBiZSBhcHBlbmRlZCB0byB0aGUgZm9ybSBkYXRhLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgb3JpZ2luYWwgZW50aXR5LiBJcyBuZWVkZWQgdG8gZ2V0IHRoZSBtZXRhZGF0YSBvZiBhbGwgdGhlIGZpbGVzLlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgZW50aXR5IHRvIHVwZGF0ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlV2l0aEZvcm1EYXRhKFxuICAgICAgICBib2R5OiBQYXJ0aWFsPEVudGl0eVR5cGU+LFxuICAgICAgICBmaWxlUHJvcGVydHlLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSxcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBpZDogRW50aXR5VHlwZVtrZXlvZiBFbnRpdHlUeXBlXVxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2JvZHknLCBKU09OLnN0cmluZ2lmeShMb2Rhc2hVdGlsaXRpZXMub21pdEJ5KGJvZHksIExvZGFzaFV0aWxpdGllcy5pc05pbCkpKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZmlsZVByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgaWYgKEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5LCBEZWNvcmF0b3JUeXBlcy5GSUxFX0RFRkFVTFQpLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlRGF0YVZhbHVlcyA9IGJvZHlba2V5XSBhcyBGaWxlRGF0YVtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgZmlsZURhdGFWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSBhcyBzdHJpbmcsIChhd2FpdCBGaWxlVXRpbGl0aWVzLmdldEZpbGVEYXRhKHZhbHVlKSkuZmlsZSwgdmFsdWUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlRGF0YSA9IGJvZHlba2V5XSBhcyBGaWxlRGF0YTtcbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5IGFzIHN0cmluZywgKGF3YWl0IEZpbGVVdGlsaXRpZXMuZ2V0RmlsZURhdGEoZmlsZURhdGEpKS5maWxlLCBmaWxlRGF0YS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cGRhdGVkRW50aXR5ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgICB0aGlzLmh0dHAucGF0Y2g8RW50aXR5VHlwZT4oYCR7dGhpcy5iYXNlVXJsfS8ke2lkfWAsIGZvcm1EYXRhKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmVudGl0aWVzW3RoaXMuZW50aXRpZXMuZmluZEluZGV4KGUgPT4gZVt0aGlzLmlkS2V5XSA9PT0gaWQpXSA9IHVwZGF0ZWRFbnRpdHk7XG4gICAgICAgIHRoaXMuZW50aXRpZXNTdWJqZWN0Lm5leHQodGhpcy5lbnRpdGllcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgZW50aXR5IHdpdGggYSBub3JtYWwganNvbiBib2R5IGluIGNvbnRyYXN0IHRvIHVwZGF0aW5nIGl0IHdpdGggZm9ybSBkYXRhIHdoZW4gdGhlIGVudGl0eSBjb250YWlucyBmaWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBib2R5IC0gVGhlIGJvZHkgb2YgdGhlIFJlcXVlc3QuIEhhcyBhbHJlYWR5IHJlbW92ZWQgYWxsIHVubmVjZXNzYXJ5IHZhbHVlcy5cbiAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIGVudGl0eSB0byB1cGRhdGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZVdpdGhKc29uKGJvZHk6IFBhcnRpYWw8RW50aXR5VHlwZT4sIGlkOiBFbnRpdHlUeXBlW2tleW9mIEVudGl0eVR5cGVdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRFbnRpdHkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICAgIHRoaXMuaHR0cC5wYXRjaDxFbnRpdHlUeXBlPihcbiAgICAgICAgICAgICAgICBgJHt0aGlzLmJhc2VVcmx9LyR7aWR9YCxcbiAgICAgICAgICAgICAgICBMb2Rhc2hVdGlsaXRpZXMub21pdEJ5KGJvZHksIExvZGFzaFV0aWxpdGllcy5pc05pbClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5lbnRpdGllc1t0aGlzLmVudGl0aWVzLmZpbmRJbmRleChlID0+IGVbdGhpcy5pZEtleV0gPT09IGlkKV0gPSB1cGRhdGVkRW50aXR5O1xuICAgICAgICB0aGlzLmVudGl0aWVzU3ViamVjdC5uZXh0KHRoaXMuZW50aXRpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgYSBzcGVjaWZpYyBFbnRpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBkZWxldGUuXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlKGVudGl0eTogRW50aXR5VHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmh0dHAuZGVsZXRlPHZvaWQ+KGAke3RoaXMuYmFzZVVybH0vJHtlbnRpdHlbdGhpcy5pZEtleV19YCkpO1xuICAgICAgICAvLyB0aGUgPT0gY29tcGFyaXNvbiBpbnN0ZWFkIG9mID09PSBpcyB0byBjYXRjaCBpZHMgdGhhdCBhcmUgbnVtYmVycy5cbiAgICAgICAgdGhpcy5lbnRpdGllcy5zcGxpY2UodGhpcy5lbnRpdGllcy5maW5kSW5kZXgoZSA9PiBlW3RoaXMuaWRLZXldID09PSBlbnRpdHlbdGhpcy5pZEtleV0pLCAxKTtcbiAgICAgICAgdGhpcy5lbnRpdGllc1N1YmplY3QubmV4dCh0aGlzLmVudGl0aWVzKTtcbiAgICB9XG59Il19