@stemy/ngx-utils 12.1.2 → 13.0.1

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 (164) hide show
  1. package/bundles/stemy-ngx-utils.umd.js +26 -29
  2. package/bundles/stemy-ngx-utils.umd.js.map +1 -1
  3. package/esm2015/ngx-utils/services/config.service.js +4 -4
  4. package/esm2015/ngx-utils/services/static-language.service.js +17 -17
  5. package/esm2015/ngx-utils/services/storage.service.js +4 -4
  6. package/esm2020/ngx-utils/common-types.mjs +116 -0
  7. package/esm2020/ngx-utils/components/dynamic-table/dynamic-table.component.mjs +178 -0
  8. package/esm2020/ngx-utils/components/pagination-menu/pagination-menu.component.mjs +101 -0
  9. package/esm2020/ngx-utils/components/unordered-list/unordered-list.component.mjs +65 -0
  10. package/esm2020/ngx-utils/directives/async-method.base.mjs +68 -0
  11. package/esm2020/ngx-utils/directives/async-method.directive.mjs +28 -0
  12. package/esm2020/ngx-utils/directives/background.directive.mjs +51 -0
  13. package/esm2020/ngx-utils/directives/dynamic-table-template.directive.mjs +20 -0
  14. package/esm2020/ngx-utils/directives/global-template.directive.mjs +30 -0
  15. package/esm2020/ngx-utils/directives/icon.directive.mjs +67 -0
  16. package/esm2020/ngx-utils/directives/ngx-template-outlet.directive.mjs +90 -0
  17. package/esm2020/ngx-utils/directives/pagination-item.directive.mjs +33 -0
  18. package/esm2020/ngx-utils/directives/pagination.directive.mjs +83 -0
  19. package/esm2020/ngx-utils/directives/resource-if.directive.mjs +50 -0
  20. package/esm2020/ngx-utils/directives/sticky-class.directive.mjs +34 -0
  21. package/esm2020/ngx-utils/directives/sticky.directive.mjs +55 -0
  22. package/esm2020/ngx-utils/directives/unordered-list-item.directive.mjs +77 -0
  23. package/esm2020/ngx-utils/directives/unordered-list-template.directive.mjs +26 -0
  24. package/esm2020/ngx-utils/ngx-utils.module.mjs +321 -0
  25. package/esm2020/ngx-utils/pipes/chunk.pipe.mjs +25 -0
  26. package/esm2020/ngx-utils/pipes/entries.pipe.mjs +28 -0
  27. package/esm2020/ngx-utils/pipes/extra-item-properties.pipe.mjs +31 -0
  28. package/esm2020/ngx-utils/pipes/filter.pipe.mjs +42 -0
  29. package/esm2020/ngx-utils/pipes/find.pipe.mjs +29 -0
  30. package/esm2020/ngx-utils/pipes/format-number.pipe.mjs +21 -0
  31. package/esm2020/ngx-utils/pipes/get-offset.pipe.mjs +17 -0
  32. package/esm2020/ngx-utils/pipes/get-type.pipe.mjs +16 -0
  33. package/esm2020/ngx-utils/pipes/global-template.pipe.mjs +41 -0
  34. package/esm2020/ngx-utils/pipes/group-by.pipe.mjs +27 -0
  35. package/esm2020/ngx-utils/pipes/is-type.pipe.mjs +16 -0
  36. package/esm2020/ngx-utils/pipes/join.pipe.mjs +19 -0
  37. package/esm2020/ngx-utils/pipes/keys.pipe.mjs +22 -0
  38. package/esm2020/ngx-utils/pipes/map.pipe.mjs +29 -0
  39. package/esm2020/ngx-utils/pipes/max.pipe.mjs +26 -0
  40. package/esm2020/ngx-utils/pipes/min.pipe.mjs +26 -0
  41. package/esm2020/ngx-utils/pipes/reduce.pipe.mjs +30 -0
  42. package/esm2020/ngx-utils/pipes/remap.pipe.mjs +32 -0
  43. package/esm2020/ngx-utils/pipes/replace.pipe.mjs +16 -0
  44. package/esm2020/ngx-utils/pipes/reverse.pipe.mjs +24 -0
  45. package/esm2020/ngx-utils/pipes/round.pipe.mjs +21 -0
  46. package/esm2020/ngx-utils/pipes/safe-html.pipe.mjs +34 -0
  47. package/esm2020/ngx-utils/pipes/translate.pipe.mjs +86 -0
  48. package/esm2020/ngx-utils/pipes/values.pipe.mjs +22 -0
  49. package/esm2020/ngx-utils/plugins/resize-event.plugin.mjs +59 -0
  50. package/esm2020/ngx-utils/plugins/scroll-event.plugin.mjs +39 -0
  51. package/esm2020/ngx-utils/services/acl.service.mjs +81 -0
  52. package/esm2020/ngx-utils/services/api.service.mjs +38 -0
  53. package/esm2020/ngx-utils/services/auth.service.mjs +14 -0
  54. package/esm2020/ngx-utils/services/base-http.client.mjs +47 -0
  55. package/esm2020/ngx-utils/services/base-http.service.mjs +298 -0
  56. package/esm2020/ngx-utils/services/config.service.mjs +129 -0
  57. package/esm2020/ngx-utils/services/error-handler.service.mjs +49 -0
  58. package/esm2020/ngx-utils/services/events.service.mjs +26 -0
  59. package/esm2020/ngx-utils/services/formatter.service.mjs +47 -0
  60. package/esm2020/ngx-utils/services/global-template.service.mjs +37 -0
  61. package/esm2020/ngx-utils/services/icon.service.mjs +26 -0
  62. package/esm2020/ngx-utils/services/language.service.mjs +113 -0
  63. package/esm2020/ngx-utils/services/open-api.service.mjs +40 -0
  64. package/esm2020/ngx-utils/services/promise.service.mjs +55 -0
  65. package/esm2020/ngx-utils/services/state.service.mjs +173 -0
  66. package/esm2020/ngx-utils/services/static-language.service.mjs +166 -0
  67. package/esm2020/ngx-utils/services/storage.service.mjs +49 -0
  68. package/esm2020/ngx-utils/services/toaster.service.mjs +32 -0
  69. package/esm2020/ngx-utils/services/translated-url.serializer.mjs +73 -0
  70. package/esm2020/ngx-utils/services/universal.service.mjs +78 -0
  71. package/esm2020/ngx-utils/utils/ajax-request-handler.mjs +40 -0
  72. package/esm2020/ngx-utils/utils/array.utils.mjs +100 -0
  73. package/esm2020/ngx-utils/utils/auth.guard.mjs +181 -0
  74. package/esm2020/ngx-utils/utils/canvas.utils.mjs +388 -0
  75. package/esm2020/ngx-utils/utils/date.utils.mjs +28 -0
  76. package/esm2020/ngx-utils/utils/file.utils.mjs +90 -0
  77. package/esm2020/ngx-utils/utils/generic-value.mjs +20 -0
  78. package/esm2020/ngx-utils/utils/geometry.mjs +132 -0
  79. package/esm2020/ngx-utils/utils/initializer.mjs +20 -0
  80. package/esm2020/ngx-utils/utils/loader.utils.mjs +55 -0
  81. package/esm2020/ngx-utils/utils/math.utils.mjs +15 -0
  82. package/esm2020/ngx-utils/utils/object.utils.mjs +261 -0
  83. package/esm2020/ngx-utils/utils/observable.utils.mjs +63 -0
  84. package/esm2020/ngx-utils/utils/reflect.utils.mjs +33 -0
  85. package/esm2020/ngx-utils/utils/set.utils.mjs +20 -0
  86. package/esm2020/ngx-utils/utils/string.utils.mjs +28 -0
  87. package/esm2020/ngx-utils/utils/timer.utils.mjs +52 -0
  88. package/esm2020/ngx-utils/utils/unique.utils.mjs +24 -0
  89. package/esm2020/ngx-utils/utils/vector.mjs +77 -0
  90. package/esm2020/public_api.mjs +85 -0
  91. package/esm2020/stemy-ngx-utils.mjs +5 -0
  92. package/fesm2015/stemy-ngx-utils.js +22 -22
  93. package/fesm2015/stemy-ngx-utils.js.map +1 -1
  94. package/fesm2015/stemy-ngx-utils.mjs +5195 -0
  95. package/fesm2015/stemy-ngx-utils.mjs.map +1 -0
  96. package/fesm2020/stemy-ngx-utils.mjs +5126 -0
  97. package/fesm2020/stemy-ngx-utils.mjs.map +1 -0
  98. package/ngx-utils/components/dynamic-table/dynamic-table.component.d.ts +3 -0
  99. package/ngx-utils/components/pagination-menu/pagination-menu.component.d.ts +3 -0
  100. package/ngx-utils/components/unordered-list/unordered-list.component.d.ts +3 -0
  101. package/ngx-utils/directives/async-method.base.d.ts +3 -0
  102. package/ngx-utils/directives/async-method.directive.d.ts +3 -0
  103. package/ngx-utils/directives/background.directive.d.ts +3 -0
  104. package/ngx-utils/directives/dynamic-table-template.directive.d.ts +3 -0
  105. package/ngx-utils/directives/global-template.directive.d.ts +3 -0
  106. package/ngx-utils/directives/icon.directive.d.ts +3 -0
  107. package/ngx-utils/directives/ngx-template-outlet.directive.d.ts +3 -0
  108. package/ngx-utils/directives/pagination-item.directive.d.ts +3 -0
  109. package/ngx-utils/directives/pagination.directive.d.ts +3 -0
  110. package/ngx-utils/directives/resource-if.directive.d.ts +3 -0
  111. package/ngx-utils/directives/sticky-class.directive.d.ts +3 -0
  112. package/ngx-utils/directives/sticky.directive.d.ts +3 -0
  113. package/ngx-utils/directives/unordered-list-item.directive.d.ts +3 -0
  114. package/ngx-utils/directives/unordered-list-template.directive.d.ts +3 -0
  115. package/ngx-utils/pipes/chunk.pipe.d.ts +3 -0
  116. package/ngx-utils/pipes/entries.pipe.d.ts +3 -0
  117. package/ngx-utils/pipes/extra-item-properties.pipe.d.ts +3 -0
  118. package/ngx-utils/pipes/filter.pipe.d.ts +3 -0
  119. package/ngx-utils/pipes/find.pipe.d.ts +3 -0
  120. package/ngx-utils/pipes/format-number.pipe.d.ts +3 -0
  121. package/ngx-utils/pipes/get-offset.pipe.d.ts +3 -0
  122. package/ngx-utils/pipes/get-type.pipe.d.ts +3 -0
  123. package/ngx-utils/pipes/global-template.pipe.d.ts +3 -0
  124. package/ngx-utils/pipes/group-by.pipe.d.ts +3 -0
  125. package/ngx-utils/pipes/is-type.pipe.d.ts +3 -0
  126. package/ngx-utils/pipes/join.pipe.d.ts +3 -0
  127. package/ngx-utils/pipes/keys.pipe.d.ts +3 -0
  128. package/ngx-utils/pipes/map.pipe.d.ts +3 -0
  129. package/ngx-utils/pipes/max.pipe.d.ts +3 -0
  130. package/ngx-utils/pipes/min.pipe.d.ts +3 -0
  131. package/ngx-utils/pipes/reduce.pipe.d.ts +3 -0
  132. package/ngx-utils/pipes/remap.pipe.d.ts +3 -0
  133. package/ngx-utils/pipes/replace.pipe.d.ts +3 -0
  134. package/ngx-utils/pipes/reverse.pipe.d.ts +3 -0
  135. package/ngx-utils/pipes/round.pipe.d.ts +3 -0
  136. package/ngx-utils/pipes/safe-html.pipe.d.ts +3 -0
  137. package/ngx-utils/pipes/translate.pipe.d.ts +4 -0
  138. package/ngx-utils/pipes/values.pipe.d.ts +3 -0
  139. package/ngx-utils/plugins/resize-event.plugin.d.ts +4 -1
  140. package/ngx-utils/plugins/scroll-event.plugin.d.ts +4 -1
  141. package/ngx-utils/services/acl.service.d.ts +3 -0
  142. package/ngx-utils/services/api.service.d.ts +3 -0
  143. package/ngx-utils/services/base-http.client.d.ts +3 -0
  144. package/ngx-utils/services/base-http.service.d.ts +3 -0
  145. package/ngx-utils/services/config.service.d.ts +3 -0
  146. package/ngx-utils/services/error-handler.service.d.ts +3 -0
  147. package/ngx-utils/services/events.service.d.ts +3 -0
  148. package/ngx-utils/services/formatter.service.d.ts +3 -0
  149. package/ngx-utils/services/global-template.service.d.ts +3 -0
  150. package/ngx-utils/services/icon.service.d.ts +3 -0
  151. package/ngx-utils/services/language.service.d.ts +3 -0
  152. package/ngx-utils/services/open-api.service.d.ts +3 -0
  153. package/ngx-utils/services/promise.service.d.ts +3 -0
  154. package/ngx-utils/services/state.service.d.ts +3 -0
  155. package/ngx-utils/services/static-language.service.d.ts +4 -1
  156. package/ngx-utils/services/storage.service.d.ts +3 -0
  157. package/ngx-utils/services/toaster.service.d.ts +3 -0
  158. package/ngx-utils/services/translated-url.serializer.d.ts +3 -0
  159. package/ngx-utils/services/universal.service.d.ts +3 -0
  160. package/ngx-utils/utils/auth.guard.d.ts +3 -0
  161. package/package.json +34 -19
  162. package/public_api.d.ts +1 -0
  163. package/stemy-ngx-utils.d.ts +1 -2
  164. package/stemy-ngx-utils.metadata.json +1 -1
@@ -0,0 +1,166 @@
1
+ import { Inject, Injectable } from "@angular/core";
2
+ import { CONFIG_SERVICE, PROMISE_SERVICE } from "../common-types";
3
+ import { ObjectUtils } from "../utils/object.utils";
4
+ import { EventsService } from "./events.service";
5
+ import { StorageService } from "./storage.service";
6
+ import { BaseHttpClient } from "./base-http.client";
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "./events.service";
9
+ import * as i2 from "./storage.service";
10
+ import * as i3 from "./base-http.client";
11
+ export class StaticLanguageService {
12
+ constructor(events, storage, configs, promises, client) {
13
+ this.events = events;
14
+ this.storage = storage;
15
+ this.configs = configs;
16
+ this.promises = promises;
17
+ this.client = client;
18
+ this.editLang = null;
19
+ this.currentLang = null;
20
+ this.disableTrans = false;
21
+ this.languageList = [];
22
+ this.translations = {
23
+ none: {}
24
+ };
25
+ this.initService();
26
+ }
27
+ get defaultLanguage() {
28
+ return this.configs.getQueryParameter("lang") || this.storage.get("language", this.getDefaultLanguage());
29
+ }
30
+ get dictionary() {
31
+ return this.translations[this.currentLanguage] || {};
32
+ }
33
+ set dictionary(value) {
34
+ this.translations[this.currentLanguage] = value;
35
+ }
36
+ get languages() {
37
+ return this.languageList;
38
+ }
39
+ get currentLanguage() {
40
+ return this.currentLang || this.defaultLanguage;
41
+ }
42
+ set currentLanguage(lang) {
43
+ this.currentLang = lang;
44
+ this.events.languageChanged.emit(lang);
45
+ }
46
+ get editLanguage() {
47
+ return this.editLang || this.currentLanguage;
48
+ }
49
+ set editLanguage(lang) {
50
+ this.editLang = lang || this.currentLanguage;
51
+ }
52
+ get disableTranslations() {
53
+ return this.disableTrans;
54
+ }
55
+ set disableTranslations(value) {
56
+ this.disableTrans = value;
57
+ this.events.languageChanged.emit(this.currentLang);
58
+ }
59
+ get httpClient() {
60
+ return this.client;
61
+ }
62
+ get config() {
63
+ return this.configs.config;
64
+ }
65
+ get universal() {
66
+ return this.storage.universal;
67
+ }
68
+ initService() {
69
+ }
70
+ replaceLanguages(languages) {
71
+ languages = Array.isArray(languages) && languages.length > 0 ? languages : this.languageList;
72
+ this.languageList = Array.from(new Set(languages));
73
+ this.languageList.forEach(lang => {
74
+ this.translations[lang] = this.translations[lang] || {};
75
+ });
76
+ }
77
+ addLanguages(languages) {
78
+ if (!Array.isArray(languages) || languages.length == 0)
79
+ return;
80
+ this.replaceLanguages(this.languageList.concat(languages));
81
+ }
82
+ getTranslationSync(key, params = null) {
83
+ const lowerKey = (key || "").toLocaleLowerCase();
84
+ const translation = this.dictionary[lowerKey] || lowerKey;
85
+ return this.interpolate(translation == lowerKey ? key : translation, params);
86
+ }
87
+ getTranslation(key, params) {
88
+ if (!ObjectUtils.isString(key) || !key.length) {
89
+ throw new Error(`Parameter "key" required`);
90
+ }
91
+ const translation = ObjectUtils.getValue(this.dictionary, key, key) || key;
92
+ return this.promises.resolve(this.interpolate(translation, params));
93
+ }
94
+ getTranslations(...keys) {
95
+ return this.promises.create(resolve => {
96
+ this.promises.all(keys.map(key => this.getTranslation(key))).then(translations => {
97
+ resolve(keys.reduce((result, key, i) => {
98
+ result[key] = translations[i];
99
+ return result;
100
+ }, {}));
101
+ });
102
+ });
103
+ }
104
+ getTranslationFromObject(translations, params, lang) {
105
+ lang = lang || this.currentLanguage;
106
+ return this.interpolate(translations ? (translations[lang] || "") : "");
107
+ }
108
+ getTranslationFromArray(translations, params, lang) {
109
+ lang = lang || this.currentLanguage;
110
+ const translation = translations ? translations.find(t => t.lang == lang) : null;
111
+ return this.interpolate(translation ? translation.translation : "", params);
112
+ }
113
+ interpolate(expr, params) {
114
+ if (typeof expr === "string") {
115
+ return this.interpolateString(expr, params);
116
+ }
117
+ if (typeof expr === "function") {
118
+ return expr(params);
119
+ }
120
+ return expr;
121
+ }
122
+ interpolateString(expr, params) {
123
+ if (!expr || !params)
124
+ return expr;
125
+ return expr.replace(/{{\s?([^{}\s]*)\s?}}/g, (substring, b) => {
126
+ const r = ObjectUtils.getValue(params, b);
127
+ return ObjectUtils.isDefined(r) ? r : substring;
128
+ });
129
+ }
130
+ getDefaultLanguage() {
131
+ if (!this.universal.isBrowser || typeof window.navigator === "undefined") {
132
+ return "de";
133
+ }
134
+ let browserLang = (window.navigator.languages ? window.navigator.languages[0] : null)
135
+ || window.navigator.language || window.navigator["browserLanguage"] || window.navigator["userLanguage"] || null;
136
+ if (!browserLang)
137
+ return browserLang;
138
+ ["-", "_"].forEach(splitter => {
139
+ if (browserLang.indexOf(splitter) >= 0) {
140
+ browserLang = browserLang.split(splitter)[0];
141
+ }
142
+ });
143
+ return browserLang;
144
+ }
145
+ }
146
+ StaticLanguageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: StaticLanguageService, deps: [{ token: EventsService }, { token: StorageService }, { token: CONFIG_SERVICE }, { token: PROMISE_SERVICE }, { token: BaseHttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
147
+ StaticLanguageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: StaticLanguageService });
148
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: StaticLanguageService, decorators: [{
149
+ type: Injectable
150
+ }], ctorParameters: function () { return [{ type: i1.EventsService, decorators: [{
151
+ type: Inject,
152
+ args: [EventsService]
153
+ }] }, { type: i2.StorageService, decorators: [{
154
+ type: Inject,
155
+ args: [StorageService]
156
+ }] }, { type: undefined, decorators: [{
157
+ type: Inject,
158
+ args: [CONFIG_SERVICE]
159
+ }] }, { type: undefined, decorators: [{
160
+ type: Inject,
161
+ args: [PROMISE_SERVICE]
162
+ }] }, { type: i3.BaseHttpClient, decorators: [{
163
+ type: Inject,
164
+ args: [BaseHttpClient]
165
+ }] }]; } });
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLWxhbmd1YWdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LXV0aWxzL3NlcnZpY2VzL3N0YXRpYy1sYW5ndWFnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFDSCxjQUFjLEVBT2QsZUFBZSxFQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWpELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7QUFJbEQsTUFBTSxPQUFPLHFCQUFxQjtJQThEOUIsWUFBNEMsTUFBcUIsRUFDcEIsT0FBdUIsRUFDdkIsT0FBdUIsRUFDckIsUUFBeUIsRUFDMUIsTUFBc0I7UUFKeEIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNwQixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUN2QixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUNyQixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUMxQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUNoRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsWUFBWSxHQUFHO1lBQ2hCLElBQUksRUFBRSxFQUFFO1NBQ1gsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJ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QUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzFCLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BDLFdBQVcsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hEO1FBQ0wsQ0FBQyxDQUFDLENBQUE7UUFDRixPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDOztrSEFsS1EscUJBQXFCLGtCQThEVixhQUFhLGFBQ2IsY0FBYyxhQUNkLGNBQWMsYUFDZCxlQUFlLGFBQ2YsY0FBYztzSEFsRXpCLHFCQUFxQjsyRkFBckIscUJBQXFCO2tCQURqQyxVQUFVOzswQkErRE0sTUFBTTsyQkFBQyxhQUFhOzswQkFDcEIsTUFBTTsyQkFBQyxjQUFjOzswQkFDckIsTUFBTTsyQkFBQyxjQUFjOzswQkFDckIsTUFBTTsyQkFBQyxlQUFlOzswQkFDdEIsTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7XHJcbiAgICBDT05GSUdfU0VSVklDRSxcclxuICAgIElDb25maWdTZXJ2aWNlLFxyXG4gICAgSUNvbmZpZ3VyYXRpb24sXHJcbiAgICBJTGFuZ3VhZ2VTZXJ2aWNlLFxyXG4gICAgSVByb21pc2VTZXJ2aWNlLFxyXG4gICAgSVRyYW5zbGF0aW9uLFxyXG4gICAgSVRyYW5zbGF0aW9ucyxcclxuICAgIFBST01JU0VfU0VSVklDRVxyXG59IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIi4uL3V0aWxzL29iamVjdC51dGlsc1wiO1xyXG5pbXBvcnQge0V2ZW50c1NlcnZpY2V9IGZyb20gXCIuL2V2ZW50cy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7U3RvcmFnZVNlcnZpY2V9IGZyb20gXCIuL3N0b3JhZ2Uuc2VydmljZVwiO1xyXG5pbXBvcnQge1VuaXZlcnNhbFNlcnZpY2V9IGZyb20gXCIuL3VuaXZlcnNhbC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7QmFzZUh0dHBDbGllbnR9IGZyb20gXCIuL2Jhc2UtaHR0cC5jbGllbnRcIjtcclxuaW1wb3J0IHtIdHRwQ2xpZW50fSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFN0YXRpY0xhbmd1YWdlU2VydmljZSBpbXBsZW1lbnRzIElMYW5ndWFnZVNlcnZpY2Uge1xyXG5cclxuICAgIGdldCBkZWZhdWx0TGFuZ3VhZ2UoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWdzLmdldFF1ZXJ5UGFyYW1ldGVyKFwibGFuZ1wiKSB8fCB0aGlzLnN0b3JhZ2UuZ2V0KFwibGFuZ3VhZ2VcIiwgdGhpcy5nZXREZWZhdWx0TGFuZ3VhZ2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpY3Rpb25hcnkoKTogSVRyYW5zbGF0aW9ucyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25zW3RoaXMuY3VycmVudExhbmd1YWdlXSB8fCB7fTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgZGljdGlvbmFyeSh2YWx1ZTogSVRyYW5zbGF0aW9ucykge1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb25zW3RoaXMuY3VycmVudExhbmd1YWdlXSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsYW5ndWFnZXMoKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZUxpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGN1cnJlbnRMYW5ndWFnZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRMYW5nIHx8IHRoaXMuZGVmYXVsdExhbmd1YWdlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBjdXJyZW50TGFuZ3VhZ2UobGFuZzogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50TGFuZyA9IGxhbmc7XHJcbiAgICAgICAgdGhpcy5ldmVudHMubGFuZ3VhZ2VDaGFuZ2VkLmVtaXQobGFuZyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGVkaXRMYW5ndWFnZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRMYW5nIHx8IHRoaXMuY3VycmVudExhbmd1YWdlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBlZGl0TGFuZ3VhZ2UobGFuZzogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0TGFuZyA9IGxhbmcgfHwgdGhpcy5jdXJyZW50TGFuZ3VhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpc2FibGVUcmFuc2xhdGlvbnMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZVRyYW5zO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBkaXNhYmxlVHJhbnNsYXRpb25zKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlVHJhbnMgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmV2ZW50cy5sYW5ndWFnZUNoYW5nZWQuZW1pdCh0aGlzLmN1cnJlbnRMYW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaHR0cENsaWVudCgpOiBIdHRwQ2xpZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbmZpZygpOiBJQ29uZmlndXJhdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlncy5jb25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHVuaXZlcnNhbCgpOiBVbml2ZXJzYWxTZXJ2aWNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLnVuaXZlcnNhbDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZWRpdExhbmc6IHN0cmluZztcclxuICAgIHByb3RlY3RlZCBjdXJyZW50TGFuZzogc3RyaW5nO1xyXG4gICAgcHJvdGVjdGVkIGRpc2FibGVUcmFuczogYm9vbGVhbjtcclxuICAgIHByb3RlY3RlZCBsYW5ndWFnZUxpc3Q6IHN0cmluZ1tdO1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zbGF0aW9uczogSVRyYW5zbGF0aW9ucztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KEV2ZW50c1NlcnZpY2UpIHJlYWRvbmx5IGV2ZW50czogRXZlbnRzU2VydmljZSxcclxuICAgICAgICAgICAgICAgIEBJbmplY3QoU3RvcmFnZVNlcnZpY2UpIHJlYWRvbmx5IHN0b3JhZ2U6IFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgQEluamVjdChDT05GSUdfU0VSVklDRSkgcmVhZG9ubHkgY29uZmlnczogSUNvbmZpZ1NlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBASW5qZWN0KFBST01JU0VfU0VSVklDRSkgcHJvdGVjdGVkIHByb21pc2VzOiBJUHJvbWlzZVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBASW5qZWN0KEJhc2VIdHRwQ2xpZW50KSBwcm90ZWN0ZWQgY2xpZW50OiBCYXNlSHR0cENsaWVudCkge1xyXG4gICAgICAgIHRoaXMuZWRpdExhbmcgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY3VycmVudExhbmcgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZVRyYW5zID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sYW5ndWFnZUxpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0aW9ucyA9IHtcclxuICAgICAgICAgICAgbm9uZToge31cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuaW5pdFNlcnZpY2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFNlcnZpY2UoKTogdm9pZCB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHJlcGxhY2VMYW5ndWFnZXMobGFuZ3VhZ2VzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgICAgIGxhbmd1YWdlcyA9IEFycmF5LmlzQXJyYXkobGFuZ3VhZ2VzKSAmJiBsYW5ndWFnZXMubGVuZ3RoID4gMCA/IGxhbmd1YWdlcyA6IHRoaXMubGFuZ3VhZ2VMaXN0O1xyXG4gICAgICAgIHRoaXMubGFuZ3VhZ2VMaXN0ID0gQXJyYXkuZnJvbShuZXcgU2V0PHN0cmluZz4obGFuZ3VhZ2VzKSk7XHJcbiAgICAgICAgdGhpcy5sYW5ndWFnZUxpc3QuZm9yRWFjaChsYW5nID0+IHtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGlvbnNbbGFuZ10gPSB0aGlzLnRyYW5zbGF0aW9uc1tsYW5nXSB8fCB7fTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRMYW5ndWFnZXMobGFuZ3VhZ2VzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShsYW5ndWFnZXMpIHx8IGxhbmd1YWdlcy5sZW5ndGggPT0gMCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucmVwbGFjZUxhbmd1YWdlcyh0aGlzLmxhbmd1YWdlTGlzdC5jb25jYXQobGFuZ3VhZ2VzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VHJhbnNsYXRpb25TeW5jKGtleTogc3RyaW5nLCBwYXJhbXM6IGFueSA9IG51bGwpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGxvd2VyS2V5ID0gKGtleSB8fCBcIlwiKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGhpcy5kaWN0aW9uYXJ5W2xvd2VyS2V5XSB8fCBsb3dlcktleTtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZSh0cmFuc2xhdGlvbiA9PSBsb3dlcktleSA/IGtleSA6IHRyYW5zbGF0aW9uLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFRyYW5zbGF0aW9uKGtleTogc3RyaW5nLCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIGlmICghT2JqZWN0VXRpbHMuaXNTdHJpbmcoa2V5KSB8fCAha2V5Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcmFtZXRlciBcImtleVwiIHJlcXVpcmVkYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gT2JqZWN0VXRpbHMuZ2V0VmFsdWUodGhpcy5kaWN0aW9uYXJ5LCBrZXksIGtleSkgfHwga2V5O1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2VzLnJlc29sdmUodGhpcy5pbnRlcnBvbGF0ZSh0cmFuc2xhdGlvbiwgcGFyYW1zKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VHJhbnNsYXRpb25zKC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxJVHJhbnNsYXRpb25zPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZXMuY3JlYXRlPElUcmFuc2xhdGlvbnM+KHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnByb21pc2VzLmFsbChrZXlzLm1hcChrZXkgPT4gdGhpcy5nZXRUcmFuc2xhdGlvbihrZXkpKSkudGhlbih0cmFuc2xhdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShrZXlzLnJlZHVjZSgocmVzdWx0LCBrZXksIGkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHRyYW5zbGF0aW9uc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfSwge30pKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VHJhbnNsYXRpb25Gcm9tT2JqZWN0KHRyYW5zbGF0aW9uczogSVRyYW5zbGF0aW9ucywgcGFyYW1zPzogYW55LCBsYW5nPzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsYW5nID0gbGFuZyB8fCB0aGlzLmN1cnJlbnRMYW5ndWFnZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZSh0cmFuc2xhdGlvbnMgPyAodHJhbnNsYXRpb25zW2xhbmddIHx8IFwiXCIpIDogXCJcIilcclxuICAgIH1cclxuXHJcbiAgICBnZXRUcmFuc2xhdGlvbkZyb21BcnJheSh0cmFuc2xhdGlvbnM6IElUcmFuc2xhdGlvbltdLCBwYXJhbXM/OiBhbnksIGxhbmc/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGxhbmcgPSBsYW5nIHx8IHRoaXMuY3VycmVudExhbmd1YWdlO1xyXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25zID8gdHJhbnNsYXRpb25zLmZpbmQodCA9PiB0LmxhbmcgPT0gbGFuZykgOiBudWxsO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVycG9sYXRlKHRyYW5zbGF0aW9uID8gdHJhbnNsYXRpb24udHJhbnNsYXRpb24gOiBcIlwiLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbnRlcnBvbGF0ZShleHByOiBzdHJpbmcgfCBGdW5jdGlvbiwgcGFyYW1zPzogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBpZiAodHlwZW9mIGV4cHIgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVTdHJpbmcoZXhwciwgcGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBleHByID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGV4cHIocGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGV4cHIgYXMgc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbnRlcnBvbGF0ZVN0cmluZyhleHByOiBzdHJpbmcsIHBhcmFtcz86IGFueSkge1xyXG4gICAgICAgIGlmICghZXhwciB8fCAhcGFyYW1zKSByZXR1cm4gZXhwcjtcclxuICAgICAgICByZXR1cm4gZXhwci5yZXBsYWNlKC97e1xccz8oW157fVxcc10qKVxccz99fS9nLCAoc3Vic3RyaW5nOiBzdHJpbmcsIGI6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByID0gT2JqZWN0VXRpbHMuZ2V0VmFsdWUocGFyYW1zLCBiKTtcclxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdFV0aWxzLmlzRGVmaW5lZChyKSA/IHIgOiBzdWJzdHJpbmc7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldERlZmF1bHRMYW5ndWFnZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghdGhpcy51bml2ZXJzYWwuaXNCcm93c2VyIHx8IHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcImRlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBicm93c2VyTGFuZzogc3RyaW5nID0gKHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2VzID8gd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF0gOiBudWxsKVxyXG4gICAgICAgICAgICB8fCB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlIHx8IHdpbmRvdy5uYXZpZ2F0b3JbXCJicm93c2VyTGFuZ3VhZ2VcIl0gfHwgd2luZG93Lm5hdmlnYXRvcltcInVzZXJMYW5ndWFnZVwiXSB8fCBudWxsO1xyXG4gICAgICAgIGlmICghYnJvd3NlckxhbmcpIHJldHVybiBicm93c2VyTGFuZztcclxuXHJcbiAgICAgICAgW1wiLVwiLCBcIl9cIl0uZm9yRWFjaChzcGxpdHRlciA9PiB7XHJcbiAgICAgICAgICAgIGlmIChicm93c2VyTGFuZy5pbmRleE9mKHNwbGl0dGVyKSA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBicm93c2VyTGFuZyA9IGJyb3dzZXJMYW5nLnNwbGl0KHNwbGl0dGVyKVswXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIGJyb3dzZXJMYW5nO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,49 @@
1
+ import { Injectable } from "@angular/core";
2
+ import { StorageMode } from "../common-types";
3
+ import { UniversalService } from "./universal.service";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "./universal.service";
6
+ /**
7
+ * Use this service instead of Storage to avoid Angular Universal breaks on server environment
8
+ */
9
+ export class StorageService {
10
+ constructor(universal) {
11
+ this.universal = universal;
12
+ }
13
+ get(key, defaultValue, mode = StorageMode.Local) {
14
+ if (!this.universal.isBrowser)
15
+ return defaultValue;
16
+ const storage = mode == StorageMode.Local ? localStorage : sessionStorage;
17
+ const item = storage.getItem(key);
18
+ if (!item)
19
+ return defaultValue;
20
+ try {
21
+ return JSON.parse(item);
22
+ }
23
+ catch (e) {
24
+ return item;
25
+ }
26
+ }
27
+ set(key, value, mode = StorageMode.Local) {
28
+ if (!this.universal.isBrowser)
29
+ return;
30
+ const storage = mode == StorageMode.Local ? localStorage : sessionStorage;
31
+ if (typeof value == "string") {
32
+ storage.setItem(key, value);
33
+ return;
34
+ }
35
+ storage.setItem(key, JSON.stringify(value));
36
+ }
37
+ remove(key, mode = StorageMode.Local) {
38
+ if (!this.universal.isBrowser)
39
+ return;
40
+ const storage = mode == StorageMode.Local ? localStorage : sessionStorage;
41
+ storage.removeItem(key);
42
+ }
43
+ }
44
+ StorageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: StorageService, deps: [{ token: i1.UniversalService }], target: i0.ɵɵFactoryTarget.Injectable });
45
+ StorageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: StorageService });
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: StorageService, decorators: [{
47
+ type: Injectable
48
+ }], ctorParameters: function () { return [{ type: i1.UniversalService }]; } });
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25neC11dGlscy9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7OztBQUVyRDs7R0FFRztBQUVILE1BQU0sT0FBTyxjQUFjO0lBRXZCLFlBQXFCLFNBQTJCO1FBQTNCLGNBQVMsR0FBVCxTQUFTLENBQWtCO0lBQ2hELENBQUM7SUFFRCxHQUFHLENBQUMsR0FBVyxFQUFFLFlBQWtCLEVBQUUsT0FBb0IsV0FBVyxDQUFDLEtBQUs7UUFDdEUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUztZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztRQUMxRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDL0IsSUFBSTtZQUNBLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1IsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNMLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQVUsRUFBRSxPQUFvQixXQUFXLENBQUMsS0FBSztRQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTO1lBQUUsT0FBTztRQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDMUUsSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLEVBQUU7WUFDMUIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUIsT0FBTztTQUNWO1FBQ0QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxNQUFNLENBQUMsR0FBVyxFQUFFLE9BQW9CLFdBQVcsQ0FBQyxLQUFLO1FBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztRQUMxRSxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7OzJHQS9CUSxjQUFjOytHQUFkLGNBQWM7MkZBQWQsY0FBYztrQkFEMUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtTdG9yYWdlTW9kZX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge1VuaXZlcnNhbFNlcnZpY2V9IGZyb20gXCIuL3VuaXZlcnNhbC5zZXJ2aWNlXCI7XHJcblxyXG4vKipcclxuICogVXNlIHRoaXMgc2VydmljZSBpbnN0ZWFkIG9mIFN0b3JhZ2UgdG8gYXZvaWQgQW5ndWxhciBVbml2ZXJzYWwgYnJlYWtzIG9uIHNlcnZlciBlbnZpcm9ubWVudFxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgU3RvcmFnZVNlcnZpY2Uge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHVuaXZlcnNhbDogVW5pdmVyc2FsU2VydmljZSkge1xyXG4gICAgfVxyXG5cclxuICAgIGdldChrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55LCBtb2RlOiBTdG9yYWdlTW9kZSA9IFN0b3JhZ2VNb2RlLkxvY2FsKTogYW55IHtcclxuICAgICAgICBpZiAoIXRoaXMudW5pdmVyc2FsLmlzQnJvd3NlcikgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICBjb25zdCBzdG9yYWdlID0gbW9kZSA9PSBTdG9yYWdlTW9kZS5Mb2NhbCA/IGxvY2FsU3RvcmFnZSA6IHNlc3Npb25TdG9yYWdlO1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSBzdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgICBpZiAoIWl0ZW0pIHJldHVybiBkZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoaXRlbSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBtb2RlOiBTdG9yYWdlTW9kZSA9IFN0b3JhZ2VNb2RlLkxvY2FsKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVuaXZlcnNhbC5pc0Jyb3dzZXIpIHJldHVybjtcclxuICAgICAgICBjb25zdCBzdG9yYWdlID0gbW9kZSA9PSBTdG9yYWdlTW9kZS5Mb2NhbCA/IGxvY2FsU3RvcmFnZSA6IHNlc3Npb25TdG9yYWdlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmUoa2V5OiBzdHJpbmcsIG1vZGU6IFN0b3JhZ2VNb2RlID0gU3RvcmFnZU1vZGUuTG9jYWwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMudW5pdmVyc2FsLmlzQnJvd3NlcikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBtb2RlID09IFN0b3JhZ2VNb2RlLkxvY2FsID8gbG9jYWxTdG9yYWdlIDogc2Vzc2lvblN0b3JhZ2U7XHJcbiAgICAgICAgc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,32 @@
1
+ import { Inject, Injectable } from "@angular/core";
2
+ import { LANGUAGE_SERVICE } from "../common-types";
3
+ import * as i0 from "@angular/core";
4
+ export class ConsoleToasterService {
5
+ constructor(language) {
6
+ this.language = language;
7
+ }
8
+ error(message, params, title) {
9
+ this.translateMessage(message, params, str => console.log(str, title, "background: #BD362F; color: #ffffff"));
10
+ }
11
+ info(message, params, title) {
12
+ this.translateMessage(message, params, str => console.log(str, title, "background: #2F96B4; color: #ffffff"));
13
+ }
14
+ success(message, params, title) {
15
+ this.translateMessage(message, params, str => console.log(str, title, "background: #51A351; color: #ffffff"));
16
+ }
17
+ warning(message, params, title) {
18
+ this.translateMessage(message, params, str => console.log(str, title, "background: #F89406; color: #ffffff"));
19
+ }
20
+ translateMessage(message, params, callback) {
21
+ this.language.getTranslation(message, params).then(callback);
22
+ }
23
+ }
24
+ ConsoleToasterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: ConsoleToasterService, deps: [{ token: LANGUAGE_SERVICE }], target: i0.ɵɵFactoryTarget.Injectable });
25
+ ConsoleToasterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: ConsoleToasterService });
26
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: ConsoleToasterService, decorators: [{
27
+ type: Injectable
28
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
29
+ type: Inject,
30
+ args: [LANGUAGE_SERVICE]
31
+ }] }]; } });
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Rlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25neC11dGlscy9zZXJ2aWNlcy90b2FzdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFvQyxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDOztBQUdwRixNQUFNLE9BQU8scUJBQXFCO0lBRTlCLFlBQThDLFFBQTBCO1FBQTFCLGFBQVEsR0FBUixRQUFRLENBQWtCO0lBRXhFLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBZSxFQUFFLE1BQVksRUFBRSxLQUFjO1FBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLHFDQUFxQyxDQUFDLENBQUMsQ0FBQztJQUNsSCxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQWUsRUFBRSxNQUFZLEVBQUUsS0FBYztRQUM5QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDLENBQUM7SUFDbEgsQ0FBQztJQUVELE9BQU8sQ0FBQyxPQUFlLEVBQUUsTUFBWSxFQUFFLEtBQWM7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUscUNBQXFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFRCxPQUFPLENBQUMsT0FBZSxFQUFFLE1BQVksRUFBRSxLQUFjO1FBQ2pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLHFDQUFxQyxDQUFDLENBQUMsQ0FBQztJQUNsSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsT0FBZSxFQUFFLE1BQVcsRUFBRSxRQUFtQztRQUN0RixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7O2tIQXhCUSxxQkFBcUIsa0JBRVYsZ0JBQWdCO3NIQUYzQixxQkFBcUI7MkZBQXJCLHFCQUFxQjtrQkFEakMsVUFBVTs7MEJBR00sTUFBTTsyQkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtJTGFuZ3VhZ2VTZXJ2aWNlLCBJVG9hc3RlclNlcnZpY2UsIExBTkdVQUdFX1NFUlZJQ0V9IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENvbnNvbGVUb2FzdGVyU2VydmljZSBpbXBsZW1lbnRzIElUb2FzdGVyU2VydmljZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoQEluamVjdChMQU5HVUFHRV9TRVJWSUNFKSBwcml2YXRlIGxhbmd1YWdlOiBJTGFuZ3VhZ2VTZXJ2aWNlKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgcGFyYW1zPzogYW55LCB0aXRsZT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRlTWVzc2FnZShtZXNzYWdlLCBwYXJhbXMsIHN0ciA9PiBjb25zb2xlLmxvZyhzdHIsIHRpdGxlLCBcImJhY2tncm91bmQ6ICNCRDM2MkY7IGNvbG9yOiAjZmZmZmZmXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgcGFyYW1zPzogYW55LCB0aXRsZT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRlTWVzc2FnZShtZXNzYWdlLCBwYXJhbXMsIHN0ciA9PiBjb25zb2xlLmxvZyhzdHIsIHRpdGxlLCBcImJhY2tncm91bmQ6ICMyRjk2QjQ7IGNvbG9yOiAjZmZmZmZmXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBzdWNjZXNzKG1lc3NhZ2U6IHN0cmluZywgcGFyYW1zPzogYW55LCB0aXRsZT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRlTWVzc2FnZShtZXNzYWdlLCBwYXJhbXMsIHN0ciA9PiBjb25zb2xlLmxvZyhzdHIsIHRpdGxlLCBcImJhY2tncm91bmQ6ICM1MUEzNTE7IGNvbG9yOiAjZmZmZmZmXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICB3YXJuaW5nKG1lc3NhZ2U6IHN0cmluZywgcGFyYW1zPzogYW55LCB0aXRsZT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRlTWVzc2FnZShtZXNzYWdlLCBwYXJhbXMsIHN0ciA9PiBjb25zb2xlLmxvZyhzdHIsIHRpdGxlLCBcImJhY2tncm91bmQ6ICNGODk0MDY7IGNvbG9yOiAjZmZmZmZmXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0ZU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCBwYXJhbXM6IGFueSwgY2FsbGJhY2s6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxhbmd1YWdlLmdldFRyYW5zbGF0aW9uKG1lc3NhZ2UsIHBhcmFtcykudGhlbihjYWxsYmFjayk7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,73 @@
1
+ import { Inject, Injectable } from "@angular/core";
2
+ import { DefaultUrlSerializer, UrlSegment, UrlSegmentGroup, UrlTree } from "@angular/router";
3
+ import { LANGUAGE_SERVICE } from "../common-types";
4
+ import * as i0 from "@angular/core";
5
+ export class TranslatedUrlSerializer extends DefaultUrlSerializer {
6
+ constructor(language) {
7
+ super();
8
+ this.language = language;
9
+ this.cache = {};
10
+ }
11
+ serialize(tree) {
12
+ const copy = new UrlTree();
13
+ const dictionary = this.getDictionary(true);
14
+ copy.root = this.modifyTreeRecursive(tree.root, segment => {
15
+ segment.path = dictionary[segment.path] || segment.path;
16
+ });
17
+ copy.queryParams = tree.queryParams;
18
+ return super.serialize(copy);
19
+ }
20
+ parse(url) {
21
+ const tree = super.parse(url);
22
+ const dictionary = this.getDictionary(false);
23
+ tree.root = this.modifyTreeRecursive(tree.root, segment => {
24
+ segment.path = dictionary[segment.path] || segment.path;
25
+ });
26
+ return tree;
27
+ }
28
+ getDictionary(serialize) {
29
+ const method = serialize ? `serialize` : `parse`;
30
+ const key = `${this.language.currentLanguage}-${method}`;
31
+ if (!this.cache[key]) {
32
+ const dict = this.language.dictionary;
33
+ this.cache[key] = Object.keys(dict).reduce((res, key) => {
34
+ if (!key.startsWith("route."))
35
+ return res;
36
+ const value = dict[key];
37
+ key = key.replace("route.", "");
38
+ res[serialize ? key : value] = serialize ? value : key;
39
+ return res;
40
+ }, {});
41
+ }
42
+ return this.cache[key];
43
+ }
44
+ modifyTreeRecursive(segmentGroup, cb) {
45
+ if (!segmentGroup)
46
+ return null;
47
+ const childrenArr = [];
48
+ const children = Object.keys(segmentGroup.children || {}).reduce((res, key) => {
49
+ const child = this.modifyTreeRecursive(segmentGroup.children[key], cb);
50
+ childrenArr.push(child);
51
+ res[key] = child;
52
+ return res;
53
+ }, {});
54
+ const newGroup = new UrlSegmentGroup(segmentGroup.segments.map(s => {
55
+ s = new UrlSegment(s.path, Object.assign({}, s.parameters));
56
+ cb(s);
57
+ return s;
58
+ }), children);
59
+ childrenArr.forEach(c => {
60
+ c.parent = newGroup;
61
+ });
62
+ return newGroup;
63
+ }
64
+ }
65
+ TranslatedUrlSerializer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TranslatedUrlSerializer, deps: [{ token: LANGUAGE_SERVICE }], target: i0.ɵɵFactoryTarget.Injectable });
66
+ TranslatedUrlSerializer.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TranslatedUrlSerializer });
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: TranslatedUrlSerializer, decorators: [{
68
+ type: Injectable
69
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
70
+ type: Inject,
71
+ args: [LANGUAGE_SERVICE]
72
+ }] }]; } });
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlZC11cmwuc2VyaWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uZ3gtdXRpbHMvc2VydmljZXMvdHJhbnNsYXRlZC11cmwuc2VyaWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRixPQUFPLEVBQW1CLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7O0FBT25FLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxvQkFBb0I7SUFJN0QsWUFBK0MsUUFBMEI7UUFDckUsS0FBSyxFQUFFLENBQUM7UUFEbUMsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUFFckUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFhO1FBQ25CLE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ3RELE9BQU8sQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3BDLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsS0FB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QztZQUNOLE9BQU8sQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDZCxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3BCLENBQUMsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQzs7b0hBOURRLHVCQUF1QixrQkFJWixnQkFBZ0I7d0hBSjNCLHVCQUF1QjsyRkFBdkIsdUJBQXVCO2tCQURuQyxVQUFVOzswQkFLTSxNQUFNOzJCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0RlZmF1bHRVcmxTZXJpYWxpemVyLCBVcmxTZWdtZW50LCBVcmxTZWdtZW50R3JvdXAsIFVybFRyZWV9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHtJTGFuZ3VhZ2VTZXJ2aWNlLCBMQU5HVUFHRV9TRVJWSUNFfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElVcmxEaWN0aW9uYXJ5IHtcclxuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZ1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUcmFuc2xhdGVkVXJsU2VyaWFsaXplciBleHRlbmRzIERlZmF1bHRVcmxTZXJpYWxpemVyIHtcclxuXHJcbiAgICBwcm90ZWN0ZWQgY2FjaGU6IHtbbGFuZzogc3RyaW5nXTogSVVybERpY3Rpb25hcnl9O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoTEFOR1VBR0VfU0VSVklDRSkgcmVhZG9ubHkgbGFuZ3VhZ2U6IElMYW5ndWFnZVNlcnZpY2UpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBzZXJpYWxpemUodHJlZTogVXJsVHJlZSk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgY29weSA9IG5ldyBVcmxUcmVlKCk7XHJcbiAgICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHRoaXMuZ2V0RGljdGlvbmFyeSh0cnVlKTtcclxuICAgICAgICBjb3B5LnJvb3QgPSB0aGlzLm1vZGlmeVRyZWVSZWN1cnNpdmUodHJlZS5yb290LCBzZWdtZW50ID0+IHtcclxuICAgICAgICAgICAgc2VnbWVudC5wYXRoID0gZGljdGlvbmFyeVtzZWdtZW50LnBhdGhdIHx8IHNlZ21lbnQucGF0aDtcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb3B5LnF1ZXJ5UGFyYW1zID0gdHJlZS5xdWVyeVBhcmFtcztcclxuICAgICAgICByZXR1cm4gc3VwZXIuc2VyaWFsaXplKGNvcHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlKHVybDogc3RyaW5nKTogVXJsVHJlZSB7XHJcbiAgICAgICAgY29uc3QgdHJlZSA9IHN1cGVyLnBhcnNlKHVybCk7XHJcbiAgICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHRoaXMuZ2V0RGljdGlvbmFyeShmYWxzZSk7XHJcbiAgICAgICAgdHJlZS5yb290ID0gdGhpcy5tb2RpZnlUcmVlUmVjdXJzaXZlKHRyZWUucm9vdCwgc2VnbWVudCA9PiB7XHJcbiAgICAgICAgICAgIHNlZ21lbnQucGF0aCA9IGRpY3Rpb25hcnlbc2VnbWVudC5wYXRoXSB8fCBzZWdtZW50LnBhdGg7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRyZWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGljdGlvbmFyeShzZXJpYWxpemU6IGJvb2xlYW4pOiBJVXJsRGljdGlvbmFyeSB7XHJcbiAgICAgICAgY29uc3QgbWV0aG9kID0gc2VyaWFsaXplID8gYHNlcmlhbGl6ZWAgOiBgcGFyc2VgO1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGAke3RoaXMubGFuZ3VhZ2UuY3VycmVudExhbmd1YWdlfS0ke21ldGhvZH1gO1xyXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVtrZXldKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpY3QgPSB0aGlzLmxhbmd1YWdlLmRpY3Rpb25hcnk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FjaGVba2V5XSA9IE9iamVjdC5rZXlzKGRpY3QpLnJlZHVjZSgocmVzLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgoXCJyb3V0ZS5cIikpIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRpY3Rba2V5XTtcclxuICAgICAgICAgICAgICAgIGtleSA9IGtleS5yZXBsYWNlKFwicm91dGUuXCIsIFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgcmVzW3NlcmlhbGl6ZSA/IGtleSA6IHZhbHVlXSA9IHNlcmlhbGl6ZSA/IHZhbHVlIDoga2V5O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSwge30pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xyXG4gICAgfVxyXG5cclxuICAgIG1vZGlmeVRyZWVSZWN1cnNpdmUoc2VnbWVudEdyb3VwOiBVcmxTZWdtZW50R3JvdXAsIGNiOiAoc2VnbWVudDogVXJsU2VnbWVudCkgPT4gdm9pZCk6IFVybFNlZ21lbnRHcm91cCB7XHJcbiAgICAgICAgaWYgKCFzZWdtZW50R3JvdXApIHJldHVybiBudWxsO1xyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuQXJyID0gW107XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBPYmplY3Qua2V5cyhzZWdtZW50R3JvdXAuY2hpbGRyZW4gfHwge30pLnJlZHVjZSgocmVzLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSB0aGlzLm1vZGlmeVRyZWVSZWN1cnNpdmUoc2VnbWVudEdyb3VwLmNoaWxkcmVuW2tleV0sIGNiKTtcclxuICAgICAgICAgICAgY2hpbGRyZW5BcnIucHVzaChjaGlsZCk7XHJcbiAgICAgICAgICAgIHJlc1trZXldID0gY2hpbGQ7XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSwge30pO1xyXG4gICAgICAgIGNvbnN0IG5ld0dyb3VwID0gbmV3IFVybFNlZ21lbnRHcm91cChzZWdtZW50R3JvdXAuc2VnbWVudHMubWFwKHMgPT4ge1xyXG4gICAgICAgICAgICBzID0gbmV3IFVybFNlZ21lbnQocy5wYXRoLCBPYmplY3QuYXNzaWduKHt9LCBzLnBhcmFtZXRlcnMpKTtcclxuICAgICAgICAgICAgY2Iocyk7XHJcbiAgICAgICAgICAgIHJldHVybiBzO1xyXG4gICAgICAgIH0pLCBjaGlsZHJlbik7XHJcbiAgICAgICAgY2hpbGRyZW5BcnIuZm9yRWFjaChjID0+IHtcclxuICAgICAgICAgICAgYy5wYXJlbnQgPSBuZXdHcm91cDtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gbmV3R3JvdXA7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,78 @@
1
+ import { Inject, Injectable, PLATFORM_ID } from "@angular/core";
2
+ import { isPlatformBrowser, isPlatformServer } from "@angular/common";
3
+ import { DeviceDetectorService } from "ngx-device-detector";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "ngx-device-detector";
6
+ /**
7
+ * Use this service to determine which is the current environment
8
+ */
9
+ export class UniversalService {
10
+ constructor(platformId, dds) {
11
+ this.platformId = platformId;
12
+ this.dds = dds;
13
+ const info = this.dds.getDeviceInfo();
14
+ this.crawler = /(bot|google|baidu|bing|msn|duckduckbot|teoma|slurp|yandex|lighthouse|angular-universal|PTST)/gi.test(info.userAgent);
15
+ }
16
+ get isBrowser() {
17
+ return isPlatformBrowser(this.platformId);
18
+ }
19
+ get isServer() {
20
+ return isPlatformServer(this.platformId);
21
+ }
22
+ get deviceInfo() {
23
+ return this.isServer
24
+ ? {
25
+ userAgent: "angular-universal",
26
+ os: "unknown",
27
+ browser: "node",
28
+ device: "node",
29
+ os_version: "unknown",
30
+ browser_version: "unknown",
31
+ deviceType: "unknown",
32
+ orientation: "landscape"
33
+ }
34
+ : this.dds.getDeviceInfo();
35
+ }
36
+ get browserName() {
37
+ return this.dds.browser;
38
+ }
39
+ get browserVersion() {
40
+ return this.dds.browser_version;
41
+ }
42
+ get isExplorer() {
43
+ return this.dds.browser == "ie";
44
+ }
45
+ get isEdge() {
46
+ return this.dds.browser == "ms-edge";
47
+ }
48
+ get isChrome() {
49
+ return this.dds.browser == "chrome";
50
+ }
51
+ get isFirefox() {
52
+ return this.dds.browser == "firefox";
53
+ }
54
+ get isSafari() {
55
+ return this.dds.browser == "safari";
56
+ }
57
+ get isTablet() {
58
+ return this.dds.isTablet();
59
+ }
60
+ get isMobile() {
61
+ return this.dds.isMobile();
62
+ }
63
+ get isDesktop() {
64
+ return this.dds.isDesktop();
65
+ }
66
+ get isCrawler() {
67
+ return this.crawler;
68
+ }
69
+ }
70
+ UniversalService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: UniversalService, deps: [{ token: PLATFORM_ID }, { token: i1.DeviceDetectorService }], target: i0.ɵɵFactoryTarget.Injectable });
71
+ UniversalService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: UniversalService });
72
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: UniversalService, decorators: [{
73
+ type: Injectable
74
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
75
+ type: Inject,
76
+ args: [PLATFORM_ID]
77
+ }] }, { type: i1.DeviceDetectorService }]; } });
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdmVyc2FsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LXV0aWxzL3NlcnZpY2VzL3VuaXZlcnNhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRSxPQUFPLEVBQUMscUJBQXFCLEVBQWEsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBRXRFOztHQUVHO0FBRUgsTUFBTSxPQUFPLGdCQUFnQjtJQXVFekIsWUFBeUMsVUFBa0IsRUFBVSxHQUEwQjtRQUF0RCxlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBdUI7UUFDM0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLGdHQUFnRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekksQ0FBQztJQXhFRCxJQUFJLFNBQVM7UUFDVCxPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLFFBQVE7WUFDaEIsQ0FBQyxDQUFDO2dCQUNFLFNBQVMsRUFBRSxtQkFBbUI7Z0JBQzlCLEVBQUUsRUFBRSxTQUFTO2dCQUNiLE9BQU8sRUFBRSxNQUFNO2dCQUNmLE1BQU0sRUFBRSxNQUFNO2dCQUNkLFVBQVUsRUFBRSxTQUFTO2dCQUNyQixlQUFlLEVBQUUsU0FBUztnQkFDMUIsVUFBVSxFQUFFLFNBQVM7Z0JBQ3JCLFdBQVcsRUFBRSxXQUFXO2FBQ3BCO1lBQ1IsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksY0FBYztRQUNkLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7OzZHQW5FUSxnQkFBZ0Isa0JBdUVMLFdBQVc7aUhBdkV0QixnQkFBZ0I7MkZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVTs7MEJBd0VNLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBQTEFURk9STV9JRH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtpc1BsYXRmb3JtQnJvd3NlciwgaXNQbGF0Zm9ybVNlcnZlcn0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge0RldmljZURldGVjdG9yU2VydmljZSwgRGV2aWNlSW5mb30gZnJvbSBcIm5neC1kZXZpY2UtZGV0ZWN0b3JcIjtcclxuXHJcbi8qKlxyXG4gKiBVc2UgdGhpcyBzZXJ2aWNlIHRvIGRldGVybWluZSB3aGljaCBpcyB0aGUgY3VycmVudCBlbnZpcm9ubWVudFxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVW5pdmVyc2FsU2VydmljZSB7XHJcblxyXG4gICAgZ2V0IGlzQnJvd3NlcigpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNTZXJ2ZXIoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGlzUGxhdGZvcm1TZXJ2ZXIodGhpcy5wbGF0Zm9ybUlkKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGV2aWNlSW5mbygpOiBEZXZpY2VJbmZvIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pc1NlcnZlclxyXG4gICAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgICAgIHVzZXJBZ2VudDogXCJhbmd1bGFyLXVuaXZlcnNhbFwiLFxyXG4gICAgICAgICAgICAgICAgb3M6IFwidW5rbm93blwiLFxyXG4gICAgICAgICAgICAgICAgYnJvd3NlcjogXCJub2RlXCIsXHJcbiAgICAgICAgICAgICAgICBkZXZpY2U6IFwibm9kZVwiLFxyXG4gICAgICAgICAgICAgICAgb3NfdmVyc2lvbjogXCJ1bmtub3duXCIsXHJcbiAgICAgICAgICAgICAgICBicm93c2VyX3ZlcnNpb246IFwidW5rbm93blwiLFxyXG4gICAgICAgICAgICAgICAgZGV2aWNlVHlwZTogXCJ1bmtub3duXCIsXHJcbiAgICAgICAgICAgICAgICBvcmllbnRhdGlvbjogXCJsYW5kc2NhcGVcIlxyXG4gICAgICAgICAgICB9IGFzIGFueVxyXG4gICAgICAgICAgICA6IHRoaXMuZGRzLmdldERldmljZUluZm8oKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYnJvd3Nlck5hbWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kZHMuYnJvd3NlcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYnJvd3NlclZlcnNpb24oKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kZHMuYnJvd3Nlcl92ZXJzaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc0V4cGxvcmVyKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRkcy5icm93c2VyID09IFwiaWVcIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNFZGdlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRkcy5icm93c2VyID09IFwibXMtZWRnZVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc0Nocm9tZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kZHMuYnJvd3NlciA9PSBcImNocm9tZVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc0ZpcmVmb3goKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGRzLmJyb3dzZXIgPT0gXCJmaXJlZm94XCI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzU2FmYXJpKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRkcy5icm93c2VyID09IFwic2FmYXJpXCI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzVGFibGV0KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRkcy5pc1RhYmxldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc01vYmlsZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kZHMuaXNNb2JpbGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNEZXNrdG9wKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRkcy5pc0Rlc2t0b3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNDcmF3bGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNyYXdsZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjcmF3bGVyOiBib29sZWFuO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogc3RyaW5nLCBwcml2YXRlIGRkczogRGV2aWNlRGV0ZWN0b3JTZXJ2aWNlKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IHRoaXMuZGRzLmdldERldmljZUluZm8oKTtcclxuICAgICAgICB0aGlzLmNyYXdsZXIgPSAvKGJvdHxnb29nbGV8YmFpZHV8YmluZ3xtc258ZHVja2R1Y2tib3R8dGVvbWF8c2x1cnB8eWFuZGV4fGxpZ2h0aG91c2V8YW5ndWxhci11bml2ZXJzYWx8UFRTVCkvZ2kudGVzdChpbmZvLnVzZXJBZ2VudCk7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,40 @@
1
+ export class AjaxRequestHandler {
2
+ constructor(pattern, callback) {
3
+ this.pattern = pattern;
4
+ this.callback = callback;
5
+ this.listener = (event) => {
6
+ const details = event.detail;
7
+ if (this.pattern.test(details.url))
8
+ this.callback(details, this.params);
9
+ };
10
+ this.params = {};
11
+ if (typeof XMLHttpRequest !== "undefined" && !AjaxRequestHandler.isOverridden) {
12
+ AjaxRequestHandler.isOverridden = true;
13
+ const originalOpen = XMLHttpRequest.prototype.open;
14
+ XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
15
+ originalOpen.apply(this, arguments);
16
+ window.dispatchEvent(new CustomEvent("ajaxRequest", {
17
+ detail: {
18
+ request: this,
19
+ method: method,
20
+ url: url
21
+ }
22
+ }));
23
+ };
24
+ }
25
+ }
26
+ listen() {
27
+ if (typeof window === "undefined")
28
+ return this;
29
+ window.addEventListener("ajaxRequest", this.listener);
30
+ return this;
31
+ }
32
+ forget() {
33
+ if (typeof window === "undefined")
34
+ return;
35
+ window.removeEventListener("ajaxRequest", this.listener);
36
+ return this;
37
+ }
38
+ }
39
+ AjaxRequestHandler.isOverridden = false;
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWpheC1yZXF1ZXN0LWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LXV0aWxzL3V0aWxzL2FqYXgtcmVxdWVzdC1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxrQkFBa0I7SUFNM0IsWUFBb0IsT0FBZSxFQUFVLFFBQTZCO1FBQXRELFlBQU8sR0FBUCxPQUFPLENBQVE7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFxQjtRQThCbEUsYUFBUSxHQUFHLENBQUMsS0FBa0IsRUFBUSxFQUFFO1lBQzVDLE1BQU0sT0FBTyxHQUF3QixLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2xELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDO1FBaENFLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksT0FBTyxjQUFjLEtBQUssV0FBVyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFO1lBQzNFLGtCQUFrQixDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDdkMsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDbkQsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFBVSxNQUFjLEVBQUUsR0FBWSxFQUFFLEtBQWUsRUFBRSxJQUFhLEVBQUUsUUFBaUI7Z0JBQ3JILFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksV0FBVyxDQUFDLGFBQWEsRUFBRTtvQkFDaEQsTUFBTSxFQUFFO3dCQUNKLE9BQU8sRUFBRSxJQUFJO3dCQUNiLE1BQU0sRUFBRSxNQUFNO3dCQUNkLEdBQUcsRUFBRSxHQUFHO3FCQUNYO2lCQUNKLENBQUMsQ0FBQyxDQUFBO1lBQ1AsQ0FBQyxDQUFDO1NBQ0w7SUFDTCxDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNO1FBQ0YsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXO1lBQUUsT0FBTztRQUMxQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOztBQWhDYywrQkFBWSxHQUFZLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWpheFJlcXVlc3RDYWxsYmFjaywgSUFqYXhSZXF1ZXN0RGV0YWlsc30gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFqYXhSZXF1ZXN0SGFuZGxlciB7XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNPdmVycmlkZGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIHBhcmFtczogYW55O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcGF0dGVybjogUmVnRXhwLCBwcml2YXRlIGNhbGxiYWNrOiBBamF4UmVxdWVzdENhbGxiYWNrKSB7XHJcbiAgICAgICAgdGhpcy5wYXJhbXMgPSB7fTtcclxuICAgICAgICBpZiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSBcInVuZGVmaW5lZFwiICYmICFBamF4UmVxdWVzdEhhbmRsZXIuaXNPdmVycmlkZGVuKSB7XHJcbiAgICAgICAgICAgIEFqYXhSZXF1ZXN0SGFuZGxlci5pc092ZXJyaWRkZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbE9wZW4gPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3BlbjtcclxuICAgICAgICAgICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbiAobWV0aG9kOiBzdHJpbmcsIHVybD86IHN0cmluZywgYXN5bmM/OiBib29sZWFuLCB1c2VyPzogc3RyaW5nLCBwYXNzd29yZD86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxPcGVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJhamF4UmVxdWVzdFwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHRoaXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHVybFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsaXN0ZW4oKTogQWpheFJlcXVlc3RIYW5kbGVyIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJhamF4UmVxdWVzdFwiLCB0aGlzLmxpc3RlbmVyKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBmb3JnZXQoKTogQWpheFJlcXVlc3RIYW5kbGVyIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWpheFJlcXVlc3RcIiwgdGhpcy5saXN0ZW5lcik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsaXN0ZW5lciA9IChldmVudDogQ3VzdG9tRXZlbnQpOiB2b2lkID0+IHtcclxuICAgICAgICBjb25zdCBkZXRhaWxzOiBJQWpheFJlcXVlc3REZXRhaWxzID0gZXZlbnQuZGV0YWlsO1xyXG4gICAgICAgIGlmICh0aGlzLnBhdHRlcm4udGVzdChkZXRhaWxzLnVybCkpIHRoaXMuY2FsbGJhY2soZGV0YWlscywgdGhpcy5wYXJhbXMpO1xyXG4gICAgfTtcclxufVxyXG4iXX0=
@@ -0,0 +1,100 @@
1
+ import { ObjectUtils } from "./object.utils";
2
+ export class ArrayUtils {
3
+ static has(arr, ...items) {
4
+ if (!ObjectUtils.isArray(arr) || !ObjectUtils.isArray(items))
5
+ return false;
6
+ for (let i = 0; i < items.length; i++) {
7
+ if (arr.indexOf(items[i]) >= 0)
8
+ return true;
9
+ }
10
+ return false;
11
+ }
12
+ static match(arr, str) {
13
+ if (!ObjectUtils.isArray(arr) || !ObjectUtils.isString(str))
14
+ return false;
15
+ for (let i = 0; i < arr.length; i++) {
16
+ if (arr[i] instanceof RegExp) {
17
+ const regex = arr[i];
18
+ if (regex.test(str))
19
+ return true;
20
+ }
21
+ }
22
+ return false;
23
+ }
24
+ static any(arr, cb) {
25
+ if (!ObjectUtils.isArray(arr) || !ObjectUtils.isFunction(cb))
26
+ return false;
27
+ for (let i = 0; i < arr.length; i++) {
28
+ if (cb(arr[i]))
29
+ return true;
30
+ }
31
+ return false;
32
+ }
33
+ static move(arr, oldIndex, newIndex) {
34
+ if (!ObjectUtils.isArray(arr))
35
+ return [];
36
+ const length = arr.length;
37
+ while (oldIndex < 0) {
38
+ oldIndex += length;
39
+ }
40
+ while (newIndex < 0) {
41
+ newIndex += length;
42
+ }
43
+ if (newIndex >= length) {
44
+ let k = newIndex - length + 1;
45
+ while (k--) {
46
+ arr.push(undefined);
47
+ }
48
+ }
49
+ arr.splice(newIndex, 0, arr.splice(oldIndex, 1)[0]);
50
+ return arr;
51
+ }
52
+ static reversed(arr) {
53
+ const result = [];
54
+ if (!ObjectUtils.isArray(arr))
55
+ return result;
56
+ for (let i = arr.length - 1; i >= 0; i--) {
57
+ result.push(arr[i]);
58
+ }
59
+ return result;
60
+ }
61
+ static min(arr, cb) {
62
+ if (!ObjectUtils.isArray(arr))
63
+ return null;
64
+ let min = Number.MAX_SAFE_INTEGER;
65
+ let result = null;
66
+ for (let i = 0; i < arr.length; i++) {
67
+ const current = cb(arr[i], i);
68
+ if (current < min || result === null) {
69
+ min = current;
70
+ result = arr[i];
71
+ }
72
+ }
73
+ return result;
74
+ }
75
+ static max(arr, cb) {
76
+ if (!ObjectUtils.isArray(arr))
77
+ return null;
78
+ let max = Number.MIN_SAFE_INTEGER;
79
+ let result = null;
80
+ for (let i = 0; i < arr.length; i++) {
81
+ const current = cb(arr[i], i);
82
+ if (current > max || result === null) {
83
+ max = current;
84
+ result = arr[i];
85
+ }
86
+ }
87
+ return result;
88
+ }
89
+ static chunk(arr, size) {
90
+ if (!ObjectUtils.isArray(arr))
91
+ return [];
92
+ size = Math.max(1, size);
93
+ const result = [];
94
+ for (let i = 0; i < arr.length; i += size) {
95
+ result.push(arr.slice(i, i + size));
96
+ }
97
+ return result;
98
+ }
99
+ }
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXkudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LXV0aWxzL3V0aWxzL2FycmF5LnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxNQUFNLE9BQU8sVUFBVTtJQUVuQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQVUsRUFBRSxHQUFHLEtBQVk7UUFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25DLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1NBQy9DO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBVSxFQUFFLEdBQVc7UUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2pDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLE1BQU0sRUFBRTtnQkFDMUIsTUFBTSxLQUFLLEdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLEtBQUssQ0FBQyxJ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QUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09iamVjdFV0aWxzfSBmcm9tIFwiLi9vYmplY3QudXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBcnJheVV0aWxzIHtcclxuXHJcbiAgICBzdGF0aWMgaGFzKGFycjogYW55W10sIC4uLml0ZW1zOiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghT2JqZWN0VXRpbHMuaXNBcnJheShhcnIpIHx8ICFPYmplY3RVdGlscy5pc0FycmF5KGl0ZW1zKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGFyci5pbmRleE9mKGl0ZW1zW2ldKSA+PSAwKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBtYXRjaChhcnI6IGFueVtdLCBzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghT2JqZWN0VXRpbHMuaXNBcnJheShhcnIpIHx8ICFPYmplY3RVdGlscy5pc1N0cmluZyhzdHIpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGFycltpXSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSA8UmVnRXhwPmFycltpXTtcclxuICAgICAgICAgICAgICAgIGlmIChyZWdleC50ZXN0KHN0cikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYW55PFQ+KGFycjogVFtdLCBjYjogKGl0ZW06IFQpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmlzQXJyYXkoYXJyKSB8fCAhT2JqZWN0VXRpbHMuaXNGdW5jdGlvbihjYikpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoY2IoYXJyW2ldKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbW92ZTxUPihhcnI6IFRbXSwgb2xkSW5kZXg6IG51bWJlciwgbmV3SW5kZXg6IG51bWJlcik6IFRbXSB7XHJcbiAgICAgICAgaWYgKCFPYmplY3RVdGlscy5pc0FycmF5KGFycikpIHJldHVybiBbXTtcclxuICAgICAgICBjb25zdCBsZW5ndGggPSBhcnIubGVuZ3RoO1xyXG4gICAgICAgIHdoaWxlIChvbGRJbmRleCA8IDApIHtcclxuICAgICAgICAgICAgb2xkSW5kZXggKz0gbGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3aGlsZSAobmV3SW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgIG5ld0luZGV4ICs9IGxlbmd0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5ld0luZGV4ID49IGxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXQgayA9IG5ld0luZGV4IC0gbGVuZ3RoICsgMTtcclxuICAgICAgICAgICAgd2hpbGUgKGstLSkge1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2godW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBhcnIuc3BsaWNlKG5ld0luZGV4LCAwLCBhcnIuc3BsaWNlKG9sZEluZGV4LCAxKVswXSk7XHJcbiAgICAgICAgcmV0dXJuIGFycjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmV2ZXJzZWQoYXJyOiBhbnlbXSk6IGFueVtdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcclxuICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmlzQXJyYXkoYXJyKSkgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICBmb3IgKGxldCBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFycltpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG1pbjxUPihhcnI6IFRbXSwgY2I6IChpdGVtOiBULCBpbmRleD86IG51bWJlcikgPT4gbnVtYmVyKTogVCB7XHJcbiAgICAgICAgaWYgKCFPYmplY3RVdGlscy5pc0FycmF5KGFycikpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGxldCBtaW4gPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gY2IoYXJyW2ldLCBpKTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPCBtaW4gfHwgcmVzdWx0ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBtaW4gPSBjdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYXJyW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG1heDxUPihhcnI6IFRbXSwgY2I6IChpdGVtOiBULCBpbmRleD86IG51bWJlcikgPT4gbnVtYmVyKTogVCB7XHJcbiAgICAgICAgaWYgKCFPYmplY3RVdGlscy5pc0FycmF5KGFycikpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGxldCBtYXggPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gY2IoYXJyW2ldLCBpKTtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPiBtYXggfHwgcmVzdWx0ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBtYXggPSBjdXJyZW50O1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYXJyW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGNodW5rPFQ+KGFycjogVFtdLCBzaXplOiBudW1iZXIpOiBBcnJheTxUW10+IHtcclxuICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmlzQXJyYXkoYXJyKSkgcmV0dXJuIFtdO1xyXG4gICAgICAgIHNpemUgPSBNYXRoLm1heCgxLCBzaXplKTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXVxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSArPSBzaXplKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFyci5zbGljZShpLCBpICsgc2l6ZSkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHRcclxuICAgIH1cclxufVxyXG4iXX0=