@stemy/ngx-utils 12.1.3 → 13.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/esm2020/ngx-utils/common-types.mjs +116 -0
  2. package/esm2020/ngx-utils/components/dynamic-table/dynamic-table.component.mjs +407 -0
  3. package/esm2020/ngx-utils/components/pagination-menu/pagination-menu.component.mjs +191 -0
  4. package/esm2020/ngx-utils/components/unordered-list/unordered-list.component.mjs +261 -0
  5. package/esm2020/ngx-utils/directives/async-method.base.mjs +68 -0
  6. package/esm2020/ngx-utils/directives/async-method.directive.mjs +28 -0
  7. package/esm2020/ngx-utils/directives/background.directive.mjs +51 -0
  8. package/esm2020/ngx-utils/directives/dynamic-table-template.directive.mjs +20 -0
  9. package/esm2020/ngx-utils/directives/global-template.directive.mjs +30 -0
  10. package/esm2020/ngx-utils/directives/icon.directive.mjs +71 -0
  11. package/esm2020/ngx-utils/directives/ngx-template-outlet.directive.mjs +90 -0
  12. package/esm2020/ngx-utils/directives/pagination-item.directive.mjs +33 -0
  13. package/esm2020/ngx-utils/directives/pagination.directive.mjs +83 -0
  14. package/esm2020/ngx-utils/directives/resource-if.directive.mjs +50 -0
  15. package/esm2020/ngx-utils/directives/sticky-class.directive.mjs +34 -0
  16. package/esm2020/ngx-utils/directives/sticky.directive.mjs +59 -0
  17. package/esm2020/ngx-utils/directives/unordered-list-item.directive.mjs +77 -0
  18. package/esm2020/ngx-utils/directives/unordered-list-template.directive.mjs +26 -0
  19. package/esm2020/ngx-utils/ngx-utils.module.mjs +322 -0
  20. package/esm2020/ngx-utils/pipes/chunk.pipe.mjs +25 -0
  21. package/esm2020/ngx-utils/pipes/entries.pipe.mjs +28 -0
  22. package/esm2020/ngx-utils/pipes/extra-item-properties.pipe.mjs +31 -0
  23. package/esm2020/ngx-utils/pipes/filter.pipe.mjs +42 -0
  24. package/esm2020/ngx-utils/pipes/find.pipe.mjs +29 -0
  25. package/esm2020/ngx-utils/pipes/format-number.pipe.mjs +21 -0
  26. package/esm2020/ngx-utils/pipes/get-offset.pipe.mjs +17 -0
  27. package/esm2020/ngx-utils/pipes/get-type.pipe.mjs +16 -0
  28. package/esm2020/ngx-utils/pipes/global-template.pipe.mjs +41 -0
  29. package/esm2020/ngx-utils/pipes/group-by.pipe.mjs +27 -0
  30. package/esm2020/ngx-utils/pipes/is-type.pipe.mjs +16 -0
  31. package/esm2020/ngx-utils/pipes/join.pipe.mjs +19 -0
  32. package/esm2020/ngx-utils/pipes/keys.pipe.mjs +22 -0
  33. package/esm2020/ngx-utils/pipes/map.pipe.mjs +29 -0
  34. package/esm2020/ngx-utils/pipes/max.pipe.mjs +26 -0
  35. package/esm2020/ngx-utils/pipes/min.pipe.mjs +26 -0
  36. package/esm2020/ngx-utils/pipes/reduce.pipe.mjs +30 -0
  37. package/esm2020/ngx-utils/pipes/remap.pipe.mjs +32 -0
  38. package/esm2020/ngx-utils/pipes/replace.pipe.mjs +16 -0
  39. package/esm2020/ngx-utils/pipes/reverse.pipe.mjs +24 -0
  40. package/esm2020/ngx-utils/pipes/round.pipe.mjs +21 -0
  41. package/esm2020/ngx-utils/pipes/safe-html.pipe.mjs +34 -0
  42. package/esm2020/ngx-utils/pipes/translate.pipe.mjs +86 -0
  43. package/esm2020/ngx-utils/pipes/values.pipe.mjs +22 -0
  44. package/esm2020/ngx-utils/plugins/resize-event.plugin.mjs +59 -0
  45. package/esm2020/ngx-utils/plugins/scroll-event.plugin.mjs +39 -0
  46. package/esm2020/ngx-utils/services/acl.service.mjs +81 -0
  47. package/esm2020/ngx-utils/services/api.service.mjs +38 -0
  48. package/esm2020/ngx-utils/services/auth.service.mjs +14 -0
  49. package/esm2020/ngx-utils/services/base-http.client.mjs +47 -0
  50. package/esm2020/ngx-utils/services/base-http.service.mjs +298 -0
  51. package/esm2020/ngx-utils/services/config.service.mjs +129 -0
  52. package/esm2020/ngx-utils/services/error-handler.service.mjs +49 -0
  53. package/esm2020/ngx-utils/services/events.service.mjs +26 -0
  54. package/esm2020/ngx-utils/services/formatter.service.mjs +47 -0
  55. package/esm2020/ngx-utils/services/global-template.service.mjs +37 -0
  56. package/esm2020/ngx-utils/services/icon.service.mjs +26 -0
  57. package/esm2020/ngx-utils/services/language.service.mjs +113 -0
  58. package/esm2020/ngx-utils/services/open-api.service.mjs +40 -0
  59. package/esm2020/ngx-utils/services/promise.service.mjs +55 -0
  60. package/esm2020/ngx-utils/services/state.service.mjs +173 -0
  61. package/esm2020/ngx-utils/services/static-language.service.mjs +166 -0
  62. package/esm2020/ngx-utils/services/storage.service.mjs +49 -0
  63. package/esm2020/ngx-utils/services/toaster.service.mjs +32 -0
  64. package/esm2020/ngx-utils/services/translated-url.serializer.mjs +73 -0
  65. package/esm2020/ngx-utils/services/universal.service.mjs +78 -0
  66. package/esm2020/ngx-utils/utils/ajax-request-handler.mjs +40 -0
  67. package/esm2020/ngx-utils/utils/array.utils.mjs +100 -0
  68. package/esm2020/ngx-utils/utils/auth.guard.mjs +181 -0
  69. package/esm2020/ngx-utils/utils/canvas.utils.mjs +388 -0
  70. package/esm2020/ngx-utils/utils/date.utils.mjs +28 -0
  71. package/esm2020/ngx-utils/utils/file.utils.mjs +90 -0
  72. package/esm2020/ngx-utils/utils/generic-value.mjs +20 -0
  73. package/esm2020/ngx-utils/utils/geometry.mjs +132 -0
  74. package/esm2020/ngx-utils/utils/initializer.mjs +20 -0
  75. package/esm2020/ngx-utils/utils/loader.utils.mjs +55 -0
  76. package/esm2020/ngx-utils/utils/math.utils.mjs +15 -0
  77. package/esm2020/ngx-utils/utils/object.utils.mjs +261 -0
  78. package/esm2020/ngx-utils/utils/observable.utils.mjs +63 -0
  79. package/esm2020/ngx-utils/utils/reflect.utils.mjs +33 -0
  80. package/esm2020/ngx-utils/utils/set.utils.mjs +20 -0
  81. package/esm2020/ngx-utils/utils/string.utils.mjs +28 -0
  82. package/esm2020/ngx-utils/utils/timer.utils.mjs +52 -0
  83. package/esm2020/ngx-utils/utils/unique.utils.mjs +24 -0
  84. package/esm2020/ngx-utils/utils/vector.mjs +77 -0
  85. package/esm2020/public_api.mjs +85 -0
  86. package/esm2020/stemy-ngx-utils.mjs +5 -0
  87. package/fesm2015/stemy-ngx-utils.mjs +5990 -0
  88. package/fesm2015/stemy-ngx-utils.mjs.map +1 -0
  89. package/fesm2020/stemy-ngx-utils.mjs +5650 -0
  90. package/fesm2020/stemy-ngx-utils.mjs.map +1 -0
  91. package/ngx-utils/components/dynamic-table/dynamic-table.component.d.ts +3 -0
  92. package/ngx-utils/components/pagination-menu/pagination-menu.component.d.ts +3 -0
  93. package/ngx-utils/components/unordered-list/unordered-list.component.d.ts +3 -0
  94. package/ngx-utils/directives/async-method.base.d.ts +3 -0
  95. package/ngx-utils/directives/async-method.directive.d.ts +3 -0
  96. package/ngx-utils/directives/background.directive.d.ts +3 -0
  97. package/ngx-utils/directives/dynamic-table-template.directive.d.ts +3 -0
  98. package/ngx-utils/directives/global-template.directive.d.ts +3 -0
  99. package/ngx-utils/directives/icon.directive.d.ts +3 -0
  100. package/ngx-utils/directives/ngx-template-outlet.directive.d.ts +3 -0
  101. package/ngx-utils/directives/pagination-item.directive.d.ts +3 -0
  102. package/ngx-utils/directives/pagination.directive.d.ts +3 -0
  103. package/ngx-utils/directives/resource-if.directive.d.ts +3 -0
  104. package/ngx-utils/directives/sticky-class.directive.d.ts +3 -0
  105. package/ngx-utils/directives/sticky.directive.d.ts +3 -0
  106. package/ngx-utils/directives/unordered-list-item.directive.d.ts +3 -0
  107. package/ngx-utils/directives/unordered-list-template.directive.d.ts +3 -0
  108. package/ngx-utils/pipes/chunk.pipe.d.ts +3 -0
  109. package/ngx-utils/pipes/entries.pipe.d.ts +3 -0
  110. package/ngx-utils/pipes/extra-item-properties.pipe.d.ts +3 -0
  111. package/ngx-utils/pipes/filter.pipe.d.ts +3 -0
  112. package/ngx-utils/pipes/find.pipe.d.ts +3 -0
  113. package/ngx-utils/pipes/format-number.pipe.d.ts +3 -0
  114. package/ngx-utils/pipes/get-offset.pipe.d.ts +3 -0
  115. package/ngx-utils/pipes/get-type.pipe.d.ts +3 -0
  116. package/ngx-utils/pipes/global-template.pipe.d.ts +3 -0
  117. package/ngx-utils/pipes/group-by.pipe.d.ts +3 -0
  118. package/ngx-utils/pipes/is-type.pipe.d.ts +3 -0
  119. package/ngx-utils/pipes/join.pipe.d.ts +3 -0
  120. package/ngx-utils/pipes/keys.pipe.d.ts +3 -0
  121. package/ngx-utils/pipes/map.pipe.d.ts +3 -0
  122. package/ngx-utils/pipes/max.pipe.d.ts +3 -0
  123. package/ngx-utils/pipes/min.pipe.d.ts +3 -0
  124. package/ngx-utils/pipes/reduce.pipe.d.ts +3 -0
  125. package/ngx-utils/pipes/remap.pipe.d.ts +3 -0
  126. package/ngx-utils/pipes/replace.pipe.d.ts +3 -0
  127. package/ngx-utils/pipes/reverse.pipe.d.ts +3 -0
  128. package/ngx-utils/pipes/round.pipe.d.ts +3 -0
  129. package/ngx-utils/pipes/safe-html.pipe.d.ts +3 -0
  130. package/ngx-utils/pipes/translate.pipe.d.ts +4 -0
  131. package/ngx-utils/pipes/values.pipe.d.ts +3 -0
  132. package/ngx-utils/plugins/resize-event.plugin.d.ts +4 -1
  133. package/ngx-utils/plugins/scroll-event.plugin.d.ts +4 -1
  134. package/ngx-utils/services/acl.service.d.ts +3 -0
  135. package/ngx-utils/services/api.service.d.ts +3 -0
  136. package/ngx-utils/services/base-http.client.d.ts +3 -0
  137. package/ngx-utils/services/base-http.service.d.ts +3 -0
  138. package/ngx-utils/services/config.service.d.ts +3 -0
  139. package/ngx-utils/services/error-handler.service.d.ts +3 -0
  140. package/ngx-utils/services/events.service.d.ts +3 -0
  141. package/ngx-utils/services/formatter.service.d.ts +3 -0
  142. package/ngx-utils/services/global-template.service.d.ts +3 -0
  143. package/ngx-utils/services/icon.service.d.ts +3 -0
  144. package/ngx-utils/services/language.service.d.ts +3 -0
  145. package/ngx-utils/services/open-api.service.d.ts +3 -0
  146. package/ngx-utils/services/promise.service.d.ts +3 -0
  147. package/ngx-utils/services/state.service.d.ts +3 -0
  148. package/ngx-utils/services/static-language.service.d.ts +3 -0
  149. package/ngx-utils/services/storage.service.d.ts +3 -0
  150. package/ngx-utils/services/toaster.service.d.ts +3 -0
  151. package/ngx-utils/services/translated-url.serializer.d.ts +3 -0
  152. package/ngx-utils/services/universal.service.d.ts +3 -0
  153. package/ngx-utils/utils/auth.guard.d.ts +3 -0
  154. package/package.json +37 -19
  155. package/public_api.d.ts +1 -0
  156. package/stemy-ngx-utils.d.ts +1 -2
@@ -0,0 +1,181 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Inject, Injectable, Injector } from "@angular/core";
11
+ import { AUTH_SERVICE, FactoryDependencies } from "../common-types";
12
+ import { ReflectUtils } from "./reflect.utils";
13
+ import { ObjectUtils } from "./object.utils";
14
+ import { StateService } from "../services/state.service";
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "../services/state.service";
17
+ export class AuthGuard {
18
+ constructor(injector, state, auth) {
19
+ this.injector = injector;
20
+ this.state = state;
21
+ this.auth = auth;
22
+ }
23
+ static guardAuthenticated(auth) {
24
+ return Promise.resolve(auth.isAuthenticated);
25
+ }
26
+ static guardNotAuthenticated(auth) {
27
+ return Promise.resolve(!auth.isAuthenticated);
28
+ }
29
+ static guardNothing() {
30
+ return Promise.resolve(true);
31
+ }
32
+ static guardAuthField(auth, expression = `auth.isAuthenticated`) {
33
+ // @dynamic
34
+ const lambda = () => {
35
+ return Promise.resolve(ObjectUtils.evaluate(expression, { auth }));
36
+ };
37
+ return lambda;
38
+ }
39
+ static guardStateField(state, expression = `state.data`) {
40
+ // @dynamic
41
+ const lambda = () => {
42
+ return Promise.resolve(ObjectUtils.evaluate(expression, { state }));
43
+ };
44
+ return lambda;
45
+ }
46
+ static guardAuthStateField(auth, state, expression = `auth.isAuthenticated`) {
47
+ // @dynamic
48
+ const lambda = () => {
49
+ return Promise.resolve(ObjectUtils.evaluate(expression, { auth, state }));
50
+ };
51
+ return lambda;
52
+ }
53
+ static wildRouteMatch(segments) {
54
+ return { consumed: segments };
55
+ }
56
+ static noRouteMatch() {
57
+ return null;
58
+ }
59
+ checkRouteMenu(route) {
60
+ if (!route.data || !route.data.name)
61
+ return Promise.resolve(false);
62
+ return this.checkRoute(route);
63
+ }
64
+ checkRoute(route, next) {
65
+ const routeData = route.data || {};
66
+ if (!routeData.guards)
67
+ return Promise.resolve(!route.canActivate || this.auth.isAuthenticated);
68
+ return new Promise(resolve => {
69
+ const guards = routeData.guards.map(g => {
70
+ const guard = ReflectUtils.resolve(g, this.injector);
71
+ return guard(this.auth, route, next);
72
+ });
73
+ Promise.all(guards).then(results => {
74
+ resolve(results.indexOf(false) < 0);
75
+ });
76
+ });
77
+ }
78
+ canActivate(next, state) {
79
+ const route = next.routeConfig;
80
+ return new Promise(resolve => {
81
+ this.auth.checkAuthenticated().then(() => {
82
+ this.checkRoute(route, next).then(hasRights => {
83
+ resolve(hasRights);
84
+ if (!hasRights) {
85
+ this.getReturnState(route).then(returnState => {
86
+ if (!returnState)
87
+ return;
88
+ this.state.navigate(returnState, { queryParams: next.queryParams });
89
+ });
90
+ }
91
+ });
92
+ });
93
+ });
94
+ }
95
+ getConfig(route, config, path) {
96
+ if (!config)
97
+ return null;
98
+ const match = config.findIndex(t => t == route);
99
+ if (match >= 0)
100
+ return config;
101
+ for (const subConfig of config) {
102
+ if (subConfig.path)
103
+ path.push(subConfig.path);
104
+ const loadedChildren = (subConfig["_loadedConfig"] || { routes: null }).routes;
105
+ const match = this.getConfig(route, subConfig.children || loadedChildren, path);
106
+ if (!match) {
107
+ if (subConfig.path)
108
+ path.length -= 1;
109
+ continue;
110
+ }
111
+ return match;
112
+ }
113
+ return null;
114
+ }
115
+ getReturnState(route) {
116
+ if (!route)
117
+ return Promise.resolve(null);
118
+ if (ObjectUtils.isObject(route.data) && ObjectUtils.isArray(route.data.returnState)) {
119
+ return Promise.resolve(route.data.returnState);
120
+ }
121
+ const path = [];
122
+ const config = this.getConfig(route, this.state.routerConfig, path);
123
+ return new Promise(resolve => {
124
+ this.getReturnStateRecursive(config).then(rs => {
125
+ if (!ObjectUtils.isArray(rs)) {
126
+ resolve(rs);
127
+ return;
128
+ }
129
+ resolve(path.concat(rs));
130
+ });
131
+ });
132
+ }
133
+ getReturnStateRecursive(config, c = 0) {
134
+ if (!config || c >= config.length)
135
+ return Promise.resolve(null);
136
+ return new Promise(resolve => {
137
+ const route = config[c];
138
+ const check = !route.component ? Promise.resolve(false) : this.checkRoute(route);
139
+ check.then(res => {
140
+ if (res) {
141
+ resolve([route.path]);
142
+ return;
143
+ }
144
+ this.getReturnStateRecursive(config, c + 1).then(resolve);
145
+ });
146
+ });
147
+ }
148
+ }
149
+ AuthGuard.ɵfac = function AuthGuard_Factory(t) { return new (t || AuthGuard)(i0.ɵɵinject(Injector), i0.ɵɵinject(StateService), i0.ɵɵinject(AUTH_SERVICE)); };
150
+ AuthGuard.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AuthGuard, factory: AuthGuard.ɵfac });
151
+ __decorate([
152
+ FactoryDependencies(AUTH_SERVICE),
153
+ __metadata("design:type", Function),
154
+ __metadata("design:paramtypes", [Object, String]),
155
+ __metadata("design:returntype", Function)
156
+ ], AuthGuard, "guardAuthField", null);
157
+ __decorate([
158
+ FactoryDependencies(StateService),
159
+ __metadata("design:type", Function),
160
+ __metadata("design:paramtypes", [StateService, String]),
161
+ __metadata("design:returntype", Function)
162
+ ], AuthGuard, "guardStateField", null);
163
+ __decorate([
164
+ FactoryDependencies(AUTH_SERVICE, StateService),
165
+ __metadata("design:type", Function),
166
+ __metadata("design:paramtypes", [Object, StateService, String]),
167
+ __metadata("design:returntype", Function)
168
+ ], AuthGuard, "guardAuthStateField", null);
169
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AuthGuard, [{
170
+ type: Injectable
171
+ }], function () { return [{ type: i0.Injector, decorators: [{
172
+ type: Inject,
173
+ args: [Injector]
174
+ }] }, { type: i1.StateService, decorators: [{
175
+ type: Inject,
176
+ args: [StateService]
177
+ }] }, { type: undefined, decorators: [{
178
+ type: Inject,
179
+ args: [AUTH_SERVICE]
180
+ }] }]; }, null); })();
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uZ3gtdXRpbHMvdXRpbHMvYXV0aC5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBdUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQzs7O0FBR3ZELE1BQU0sT0FBTyxTQUFTO0lBaURsQixZQUF1QyxRQUFrQixFQUNkLEtBQW1CLEVBQ25CLElBQWtCO1FBRnRCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQ25CLFNBQUksR0FBSixJQUFJLENBQWM7SUFDN0QsQ0FBQztJQWxERCxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBa0I7UUFDeEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQWtCO1FBQzNDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVk7UUFDZixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUdELE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBa0IsRUFBRSxhQUFxQixzQkFBc0I7UUFDakYsV0FBVztRQUNYLE1BQU0sTUFBTSxH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QUMsUUFBUTs7c0JBQ2YsTUFBTTt1QkFBQyxZQUFZOztzQkFDbkIsTUFBTTt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlU25hcHNob3QsIENhbkFjdGl2YXRlLCBSb3V0ZXJTdGF0ZVNuYXBzaG90LCBVcmxTZWdtZW50fSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7QVVUSF9TRVJWSUNFLCBGYWN0b3J5RGVwZW5kZW5jaWVzLCBJQXV0aFNlcnZpY2UsIElSb3V0ZSwgUm91dGVWYWxpZGF0b3J9IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcclxuaW1wb3J0IHtSZWZsZWN0VXRpbHN9IGZyb20gXCIuL3JlZmxlY3QudXRpbHNcIjtcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIi4vb2JqZWN0LnV0aWxzXCI7XHJcbmltcG9ydCB7U3RhdGVTZXJ2aWNlfSBmcm9tIFwiLi4vc2VydmljZXMvc3RhdGUuc2VydmljZVwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQXV0aEd1YXJkIGltcGxlbWVudHMgQ2FuQWN0aXZhdGUge1xyXG5cclxuICAgIHN0YXRpYyBndWFyZEF1dGhlbnRpY2F0ZWQoYXV0aDogSUF1dGhTZXJ2aWNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhdXRoLmlzQXV0aGVudGljYXRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGd1YXJkTm90QXV0aGVudGljYXRlZChhdXRoOiBJQXV0aFNlcnZpY2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCFhdXRoLmlzQXV0aGVudGljYXRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGd1YXJkTm90aGluZygpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIEBGYWN0b3J5RGVwZW5kZW5jaWVzKEFVVEhfU0VSVklDRSlcclxuICAgIHN0YXRpYyBndWFyZEF1dGhGaWVsZChhdXRoOiBJQXV0aFNlcnZpY2UsIGV4cHJlc3Npb246IHN0cmluZyA9IGBhdXRoLmlzQXV0aGVudGljYXRlZGApOiBSb3V0ZVZhbGlkYXRvciB7XHJcbiAgICAgICAgLy8gQGR5bmFtaWNcclxuICAgICAgICBjb25zdCBsYW1iZGEgPSAoKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoT2JqZWN0VXRpbHMuZXZhbHVhdGUoZXhwcmVzc2lvbiwge2F1dGh9KSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gbGFtYmRhO1xyXG4gICAgfVxyXG5cclxuICAgIEBGYWN0b3J5RGVwZW5kZW5jaWVzKFN0YXRlU2VydmljZSlcclxuICAgIHN0YXRpYyBndWFyZFN0YXRlRmllbGQoc3RhdGU6IFN0YXRlU2VydmljZSwgZXhwcmVzc2lvbjogc3RyaW5nID0gYHN0YXRlLmRhdGFgKTogUm91dGVWYWxpZGF0b3Ige1xyXG4gICAgICAgIC8vIEBkeW5hbWljXHJcbiAgICAgICAgY29uc3QgbGFtYmRhID0gKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKE9iamVjdFV0aWxzLmV2YWx1YXRlKGV4cHJlc3Npb24sIHtzdGF0ZX0pKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBsYW1iZGE7XHJcbiAgICB9XHJcblxyXG4gICAgQEZhY3RvcnlEZXBlbmRlbmNpZXMoQVVUSF9TRVJWSUNFLCBTdGF0ZVNlcnZpY2UpXHJcbiAgICBzdGF0aWMgZ3VhcmRBdXRoU3RhdGVGaWVsZChhdXRoOiBJQXV0aFNlcnZpY2UsIHN0YXRlOiBTdGF0ZVNlcnZpY2UsIGV4cHJlc3Npb246IHN0cmluZyA9IGBhdXRoLmlzQXV0aGVudGljYXRlZGApOiBSb3V0ZVZhbGlkYXRvciB7XHJcbiAgICAgICAgLy8gQGR5bmFtaWNcclxuICAgICAgICBjb25zdCBsYW1iZGEgPSAoKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoT2JqZWN0VXRpbHMuZXZhbHVhdGUoZXhwcmVzc2lvbiwge2F1dGgsIHN0YXRlfSkpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGxhbWJkYTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgd2lsZFJvdXRlTWF0Y2goc2VnbWVudHM6IFVybFNlZ21lbnRbXSkge1xyXG4gICAgICAgIHJldHVybiB7Y29uc3VtZWQ6IHNlZ21lbnRzfTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbm9Sb3V0ZU1hdGNoKCkge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSW5qZWN0b3IpIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICAgICAgICAgIEBJbmplY3QoU3RhdGVTZXJ2aWNlKSByZWFkb25seSBzdGF0ZTogU3RhdGVTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgQEluamVjdChBVVRIX1NFUlZJQ0UpIHJlYWRvbmx5IGF1dGg6IElBdXRoU2VydmljZSkge1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrUm91dGVNZW51KHJvdXRlOiBJUm91dGUpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBpZiAoIXJvdXRlLmRhdGEgfHwgIXJvdXRlLmRhdGEubmFtZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tSb3V0ZShyb3V0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tSb3V0ZShyb3V0ZTogSVJvdXRlLCBuZXh0PzogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IHJvdXRlRGF0YSA9IHJvdXRlLmRhdGEgfHwge307XHJcbiAgICAgICAgaWYgKCFyb3V0ZURhdGEuZ3VhcmRzKVxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCFyb3V0ZS5jYW5BY3RpdmF0ZSB8fCB0aGlzLmF1dGguaXNBdXRoZW50aWNhdGVkKTtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4ocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGd1YXJkcyA9IHJvdXRlRGF0YS5ndWFyZHMubWFwKGcgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3VhcmQgPSBSZWZsZWN0VXRpbHMucmVzb2x2ZTxSb3V0ZVZhbGlkYXRvcj4oZywgdGhpcy5pbmplY3Rvcik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3VhcmQodGhpcy5hdXRoLCByb3V0ZSwgbmV4dCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBQcm9taXNlLmFsbChndWFyZHMpLnRoZW4ocmVzdWx0cyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdHMuaW5kZXhPZihmYWxzZSkgPCAwKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FuQWN0aXZhdGUobmV4dDogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCByb3V0ZSA9IDxJUm91dGU+bmV4dC5yb3V0ZUNvbmZpZztcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4ocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYXV0aC5jaGVja0F1dGhlbnRpY2F0ZWQoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tSb3V0ZShyb3V0ZSwgbmV4dCkudGhlbihoYXNSaWdodHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaGFzUmlnaHRzKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1JpZ2h0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJldHVyblN0YXRlKHJvdXRlKS50aGVuKHJldHVyblN0YXRlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV0dXJuU3RhdGUpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUubmF2aWdhdGUocmV0dXJuU3RhdGUsIHtxdWVyeVBhcmFtczogbmV4dC5xdWVyeVBhcmFtc30pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29uZmlnKHJvdXRlOiBJUm91dGUsIGNvbmZpZzogSVJvdXRlW10sIHBhdGg6IHN0cmluZ1tdKTogSVJvdXRlW10ge1xyXG4gICAgICAgIGlmICghY29uZmlnKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBjb25zdCBtYXRjaCA9IGNvbmZpZy5maW5kSW5kZXgodCA9PiB0ID09IHJvdXRlKTtcclxuICAgICAgICBpZiAobWF0Y2ggPj0gMCkgcmV0dXJuIGNvbmZpZztcclxuICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbmZpZyBvZiBjb25maWcpIHtcclxuICAgICAgICAgICAgaWYgKHN1YkNvbmZpZy5wYXRoKVxyXG4gICAgICAgICAgICAgICAgcGF0aC5wdXNoKHN1YkNvbmZpZy5wYXRoKTtcclxuICAgICAgICAgICAgY29uc3QgbG9hZGVkQ2hpbGRyZW4gPSAoc3ViQ29uZmlnW1wiX2xvYWRlZENvbmZpZ1wiXSB8fCB7cm91dGVzOiBudWxsfSkucm91dGVzO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IHRoaXMuZ2V0Q29uZmlnKHJvdXRlLCBzdWJDb25maWcuY2hpbGRyZW4gfHwgbG9hZGVkQ2hpbGRyZW4sIHBhdGgpO1xyXG4gICAgICAgICAgICBpZiAoIW1hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViQ29uZmlnLnBhdGgpXHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5sZW5ndGggLT0gMTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBtYXRjaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UmV0dXJuU3RhdGUocm91dGU6IElSb3V0ZSk6IFByb21pc2U8c3RyaW5nW10+IHtcclxuICAgICAgICBpZiAoIXJvdXRlKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gICAgICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChyb3V0ZS5kYXRhKSAmJiBPYmplY3RVdGlscy5pc0FycmF5KHJvdXRlLmRhdGEucmV0dXJuU3RhdGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocm91dGUuZGF0YS5yZXR1cm5TdGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHBhdGggPSBbXTtcclxuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZyhyb3V0ZSwgdGhpcy5zdGF0ZS5yb3V0ZXJDb25maWcsIHBhdGgpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmdbXT4ocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0UmV0dXJuU3RhdGVSZWN1cnNpdmUoY29uZmlnKS50aGVuKHJzID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0VXRpbHMuaXNBcnJheShycykpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJzKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHBhdGguY29uY2F0KHJzKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0UmV0dXJuU3RhdGVSZWN1cnNpdmUoY29uZmlnOiBJUm91dGVbXSwgYzogbnVtYmVyID0gMCk6IFByb21pc2U8c3RyaW5nW10+IHtcclxuICAgICAgICBpZiAoIWNvbmZpZyB8fCBjID49IGNvbmZpZy5sZW5ndGgpIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZ1tdPihyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgcm91dGUgPSBjb25maWdbY107XHJcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrID0gIXJvdXRlLmNvbXBvbmVudCA/IFByb21pc2UucmVzb2x2ZShmYWxzZSkgOiB0aGlzLmNoZWNrUm91dGUocm91dGUpO1xyXG4gICAgICAgICAgICBjaGVjay50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbcm91dGUucGF0aF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmV0dXJuU3RhdGVSZWN1cnNpdmUoY29uZmlnLCBjICsgMSkudGhlbihyZXNvbHZlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIl19