@jsverse/transloco 7.0.0

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 (167) hide show
  1. package/CHANGELOG.md +1005 -0
  2. package/LICENSE +22 -0
  3. package/README.md +44 -0
  4. package/esm2022/index.mjs +20 -0
  5. package/esm2022/jsverse-transloco.mjs +5 -0
  6. package/esm2022/lib/browser-lang.mjs +28 -0
  7. package/esm2022/lib/get-fallbacks-loaders.mjs +13 -0
  8. package/esm2022/lib/helpers.mjs +104 -0
  9. package/esm2022/lib/lang-resolver.mjs +54 -0
  10. package/esm2022/lib/loader-component.component.mjs +21 -0
  11. package/esm2022/lib/resolve-loader.mjs +13 -0
  12. package/esm2022/lib/scope-resolver.mjs +24 -0
  13. package/esm2022/lib/shared.mjs +73 -0
  14. package/esm2022/lib/template-handler.mjs +28 -0
  15. package/esm2022/lib/transloco-fallback-strategy.mjs +26 -0
  16. package/esm2022/lib/transloco-lang.mjs +3 -0
  17. package/esm2022/lib/transloco-loading-template.mjs +3 -0
  18. package/esm2022/lib/transloco-missing-handler.mjs +18 -0
  19. package/esm2022/lib/transloco-scope.mjs +3 -0
  20. package/esm2022/lib/transloco-testing.module.mjs +76 -0
  21. package/esm2022/lib/transloco.config.mjs +37 -0
  22. package/esm2022/lib/transloco.directive.mjs +169 -0
  23. package/esm2022/lib/transloco.interceptor.mjs +17 -0
  24. package/esm2022/lib/transloco.loader.mjs +13 -0
  25. package/esm2022/lib/transloco.module.mjs +18 -0
  26. package/esm2022/lib/transloco.pipe.mjs +97 -0
  27. package/esm2022/lib/transloco.providers.mjs +92 -0
  28. package/esm2022/lib/transloco.service.mjs +579 -0
  29. package/esm2022/lib/transloco.transpiler.mjs +145 -0
  30. package/esm2022/lib/types.mjs +2 -0
  31. package/fesm2022/jsverse-transloco.mjs +1580 -0
  32. package/fesm2022/jsverse-transloco.mjs.map +1 -0
  33. package/index.d.ts +19 -0
  34. package/lib/browser-lang.d.ts +8 -0
  35. package/lib/get-fallbacks-loaders.d.ts +14 -0
  36. package/lib/helpers.d.ts +21 -0
  37. package/lib/lang-resolver.d.ts +32 -0
  38. package/lib/loader-component.component.d.ts +6 -0
  39. package/lib/resolve-loader.d.ts +10 -0
  40. package/lib/scope-resolver.d.ts +12 -0
  41. package/lib/shared.d.ts +17 -0
  42. package/lib/template-handler.d.ts +9 -0
  43. package/lib/transloco-fallback-strategy.d.ts +14 -0
  44. package/lib/transloco-lang.d.ts +2 -0
  45. package/lib/transloco-loading-template.d.ts +3 -0
  46. package/lib/transloco-missing-handler.d.ts +16 -0
  47. package/lib/transloco-scope.d.ts +3 -0
  48. package/lib/transloco-testing.module.d.ts +27 -0
  49. package/lib/transloco.config.d.ts +27 -0
  50. package/lib/transloco.directive.d.ts +50 -0
  51. package/lib/transloco.interceptor.d.ts +14 -0
  52. package/lib/transloco.loader.d.ts +15 -0
  53. package/lib/transloco.module.d.ts +8 -0
  54. package/lib/transloco.pipe.d.ts +23 -0
  55. package/lib/transloco.providers.d.ts +30 -0
  56. package/lib/transloco.service.d.ts +199 -0
  57. package/lib/transloco.transpiler.d.ts +58 -0
  58. package/lib/types.d.ts +45 -0
  59. package/package.json +54 -0
  60. package/schematics/src/assets/i18n/en.json +1 -0
  61. package/schematics/src/collection.json +59 -0
  62. package/schematics/src/component/index.d.ts +2 -0
  63. package/schematics/src/component/index.js +21 -0
  64. package/schematics/src/component/index.js.map +1 -0
  65. package/schematics/src/join/index.d.ts +3 -0
  66. package/schematics/src/join/index.js +79 -0
  67. package/schematics/src/join/index.js.map +1 -0
  68. package/schematics/src/join/schema.d.ts +28 -0
  69. package/schematics/src/join/schema.js +3 -0
  70. package/schematics/src/join/schema.js.map +1 -0
  71. package/schematics/src/join/schema.json +43 -0
  72. package/schematics/src/keys-manager/index.d.ts +5 -0
  73. package/schematics/src/keys-manager/index.js +97 -0
  74. package/schematics/src/keys-manager/index.js.map +1 -0
  75. package/schematics/src/keys-manager/schema.d.ts +19 -0
  76. package/schematics/src/keys-manager/schema.js +3 -0
  77. package/schematics/src/keys-manager/schema.js.map +1 -0
  78. package/schematics/src/keys-manager/schema.json +33 -0
  79. package/schematics/src/migrate/index.d.ts +3 -0
  80. package/schematics/src/migrate/index.js +21 -0
  81. package/schematics/src/migrate/index.js.map +1 -0
  82. package/schematics/src/migrate/ngx-translate-migration.d.ts +3 -0
  83. package/schematics/src/migrate/ngx-translate-migration.js +169 -0
  84. package/schematics/src/migrate/ngx-translate-migration.js.map +1 -0
  85. package/schematics/src/migrate/schema.d.ts +10 -0
  86. package/schematics/src/migrate/schema.js +3 -0
  87. package/schematics/src/migrate/schema.js.map +1 -0
  88. package/schematics/src/migrate/schema.json +23 -0
  89. package/schematics/src/ng-add/files/transloco-loader/transloco-loader.__ts__ +12 -0
  90. package/schematics/src/ng-add/files/transloco-module/transloco-root.module.__ts__ +24 -0
  91. package/schematics/src/ng-add/generators/http-loader.gen.d.ts +4 -0
  92. package/schematics/src/ng-add/generators/http-loader.gen.js +15 -0
  93. package/schematics/src/ng-add/generators/http-loader.gen.js.map +1 -0
  94. package/schematics/src/ng-add/generators/root-module.gen.d.ts +9 -0
  95. package/schematics/src/ng-add/generators/root-module.gen.js +31 -0
  96. package/schematics/src/ng-add/generators/root-module.gen.js.map +1 -0
  97. package/schematics/src/ng-add/generators/translation-files.gen.d.ts +4 -0
  98. package/schematics/src/ng-add/generators/translation-files.gen.js +23 -0
  99. package/schematics/src/ng-add/generators/translation-files.gen.js.map +1 -0
  100. package/schematics/src/ng-add/index.d.ts +3 -0
  101. package/schematics/src/ng-add/index.js +103 -0
  102. package/schematics/src/ng-add/index.js.map +1 -0
  103. package/schematics/src/ng-add/schema.d.ts +42 -0
  104. package/schematics/src/ng-add/schema.js +14 -0
  105. package/schematics/src/ng-add/schema.js.map +1 -0
  106. package/schematics/src/ng-add/schema.json +53 -0
  107. package/schematics/src/ng-migrate/index.d.ts +3 -0
  108. package/schematics/src/ng-migrate/index.js +14 -0
  109. package/schematics/src/ng-migrate/index.js.map +1 -0
  110. package/schematics/src/ng-migrate/ng-migrate.d.ts +5 -0
  111. package/schematics/src/ng-migrate/ng-migrate.js +106 -0
  112. package/schematics/src/ng-migrate/ng-migrate.js.map +1 -0
  113. package/schematics/src/ng-migrate/schema.d.ts +14 -0
  114. package/schematics/src/ng-migrate/schema.js +3 -0
  115. package/schematics/src/ng-migrate/schema.js.map +1 -0
  116. package/schematics/src/ng-migrate/schema.json +27 -0
  117. package/schematics/src/schematics.consts.d.ts +4 -0
  118. package/schematics/src/schematics.consts.js +8 -0
  119. package/schematics/src/schematics.consts.js.map +1 -0
  120. package/schematics/src/scope/index.d.ts +3 -0
  121. package/schematics/src/scope/index.js +101 -0
  122. package/schematics/src/scope/index.js.map +1 -0
  123. package/schematics/src/scope/schema.d.ts +28 -0
  124. package/schematics/src/scope/schema.js +3 -0
  125. package/schematics/src/scope/schema.js.map +1 -0
  126. package/schematics/src/scope/schema.json +84 -0
  127. package/schematics/src/split/index.d.ts +3 -0
  128. package/schematics/src/split/index.js +66 -0
  129. package/schematics/src/split/index.js.map +1 -0
  130. package/schematics/src/split/schema.d.ts +20 -0
  131. package/schematics/src/split/schema.js +3 -0
  132. package/schematics/src/split/schema.js.map +1 -0
  133. package/schematics/src/split/schema.json +35 -0
  134. package/schematics/src/types.d.ts +5 -0
  135. package/schematics/src/types.js +10 -0
  136. package/schematics/src/types.js.map +1 -0
  137. package/schematics/src/upgrade/index.d.ts +3 -0
  138. package/schematics/src/upgrade/index.js +19 -0
  139. package/schematics/src/upgrade/index.js.map +1 -0
  140. package/schematics/src/upgrade/schema.d.ts +6 -0
  141. package/schematics/src/upgrade/schema.js +3 -0
  142. package/schematics/src/upgrade/schema.js.map +1 -0
  143. package/schematics/src/upgrade/schema.json +16 -0
  144. package/schematics/src/upgrade/v2.d.ts +1 -0
  145. package/schematics/src/upgrade/v2.js +89 -0
  146. package/schematics/src/upgrade/v2.js.map +1 -0
  147. package/schematics/src/utils/array.d.ts +3 -0
  148. package/schematics/src/utils/array.js +12 -0
  149. package/schematics/src/utils/array.js.map +1 -0
  150. package/schematics/src/utils/config.d.ts +2 -0
  151. package/schematics/src/utils/config.js +13 -0
  152. package/schematics/src/utils/config.js.map +1 -0
  153. package/schematics/src/utils/find-module.d.ts +23 -0
  154. package/schematics/src/utils/find-module.js +110 -0
  155. package/schematics/src/utils/find-module.js.map +1 -0
  156. package/schematics/src/utils/package.d.ts +5 -0
  157. package/schematics/src/utils/package.js +19 -0
  158. package/schematics/src/utils/package.js.map +1 -0
  159. package/schematics/src/utils/projects.d.ts +8 -0
  160. package/schematics/src/utils/projects.js +56 -0
  161. package/schematics/src/utils/projects.js.map +1 -0
  162. package/schematics/src/utils/translations.d.ts +7 -0
  163. package/schematics/src/utils/translations.js +31 -0
  164. package/schematics/src/utils/translations.js.map +1 -0
  165. package/schematics/src/utils/transloco.d.ts +24 -0
  166. package/schematics/src/utils/transloco.js +93 -0
  167. package/schematics/src/utils/transloco.js.map +1 -0
@@ -0,0 +1,145 @@
1
+ import { inject, Injectable, InjectionToken, Injector, } from '@angular/core';
2
+ import { getValue, isDefined, isObject, isString, setValue } from './helpers';
3
+ import { defaultConfig, TRANSLOCO_CONFIG, } from './transloco.config';
4
+ import * as i0 from "@angular/core";
5
+ export const TRANSLOCO_TRANSPILER = new InjectionToken('TRANSLOCO_TRANSPILER');
6
+ export class DefaultTranspiler {
7
+ config = inject(TRANSLOCO_CONFIG, { optional: true }) ?? defaultConfig;
8
+ get interpolationMatcher() {
9
+ return resolveMatcher(this.config);
10
+ }
11
+ transpile({ value, params = {}, translation, key }) {
12
+ if (isString(value)) {
13
+ let paramMatch;
14
+ let parsedValue = value;
15
+ while ((paramMatch = this.interpolationMatcher.exec(parsedValue)) !== null) {
16
+ const [match, paramValue] = paramMatch;
17
+ parsedValue = parsedValue.replace(match, () => {
18
+ const match = paramValue.trim();
19
+ if (isDefined(params[match])) {
20
+ return params[match];
21
+ }
22
+ return isDefined(translation[match])
23
+ ? this.transpile({
24
+ params, translation, key,
25
+ value: translation[match]
26
+ })
27
+ : '';
28
+ });
29
+ }
30
+ return parsedValue;
31
+ }
32
+ else if (params) {
33
+ if (isObject(value)) {
34
+ value = this.handleObject({
35
+ value: value,
36
+ params,
37
+ translation,
38
+ key
39
+ });
40
+ }
41
+ else if (Array.isArray(value)) {
42
+ value = this.handleArray({ value, params, translation, key });
43
+ }
44
+ }
45
+ return value;
46
+ }
47
+ /**
48
+ *
49
+ * @example
50
+ *
51
+ * const en = {
52
+ * a: {
53
+ * b: {
54
+ * c: "Hello {{ value }}"
55
+ * }
56
+ * }
57
+ * }
58
+ *
59
+ * const params = {
60
+ * "b.c": { value: "Transloco "}
61
+ * }
62
+ *
63
+ * service.selectTranslate('a', params);
64
+ *
65
+ * // the first param will be the result of `en.a`.
66
+ * // the second param will be `params`.
67
+ * parser.transpile(value, params, {});
68
+ *
69
+ *
70
+ */
71
+ handleObject({ value, params = {}, translation, key }) {
72
+ let result = value;
73
+ Object.keys(params).forEach((p) => {
74
+ // transpile the value => "Hello Transloco"
75
+ const transpiled = this.transpile({
76
+ // get the value of "b.c" inside "a" => "Hello {{ value }}"
77
+ value: getValue(result, p),
78
+ // get the params of "b.c" => { value: "Transloco" }
79
+ params: getValue(params, p),
80
+ translation,
81
+ key
82
+ });
83
+ // set "b.c" to `transpiled`
84
+ result = setValue(result, p, transpiled);
85
+ });
86
+ return result;
87
+ }
88
+ handleArray({ value, ...rest }) {
89
+ return value.map((v) => this.transpile({
90
+ value: v,
91
+ ...rest
92
+ }));
93
+ }
94
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DefaultTranspiler, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
95
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DefaultTranspiler });
96
+ }
97
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DefaultTranspiler, decorators: [{
98
+ type: Injectable
99
+ }] });
100
+ function resolveMatcher(config) {
101
+ const [start, end] = config.interpolation;
102
+ return new RegExp(`${start}([^${start}${end}]*?)${end}`, 'g');
103
+ }
104
+ export function getFunctionArgs(argsString) {
105
+ const splitted = argsString ? argsString.split(',') : [];
106
+ const args = [];
107
+ for (let i = 0; i < splitted.length; i++) {
108
+ let value = splitted[i].trim();
109
+ while (value[value.length - 1] === '\\') {
110
+ i++;
111
+ value = value.replace('\\', ',') + splitted[i];
112
+ }
113
+ args.push(value);
114
+ }
115
+ return args;
116
+ }
117
+ export class FunctionalTranspiler extends DefaultTranspiler {
118
+ injector = inject(Injector);
119
+ transpile({ value, ...rest }) {
120
+ let transpiled = value;
121
+ if (isString(value)) {
122
+ transpiled = value.replace(/\[\[\s*(\w+)\((.*?)\)\s*]]/g, (match, functionName, args) => {
123
+ try {
124
+ const func = this.injector.get(functionName);
125
+ return func.transpile(...getFunctionArgs(args));
126
+ }
127
+ catch (e) {
128
+ let message = `There is an error in: '${value}'.
129
+ Check that the you used the right syntax in your translation and that the implementation of ${functionName} is correct.`;
130
+ if (e.message.includes('NullInjectorError')) {
131
+ message = `You are using the '${functionName}' function in your translation but no provider was found!`;
132
+ }
133
+ throw new Error(message);
134
+ }
135
+ });
136
+ }
137
+ return super.transpile({ value: transpiled, ...rest });
138
+ }
139
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: FunctionalTranspiler, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
140
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: FunctionalTranspiler });
141
+ }
142
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: FunctionalTranspiler, decorators: [{
143
+ type: Injectable
144
+ }] });
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLnRyYW5zcGlsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3RyYW5zbG9jby9zcmMvbGliL3RyYW5zbG9jby50cmFuc3BpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxNQUFNLEVBQ04sVUFBVSxFQUNWLGNBQWMsRUFDZCxRQUFRLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDOUUsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsR0FFakIsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFNUIsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQ3BELHNCQUFzQixDQUN2QixDQUFDO0FBZ0JGLE1BQU0sT0FBTyxpQkFBaUI7SUFDbEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQztJQUUvRSxJQUFjLG9CQUFvQjtRQUNoQyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELFNBQVMsQ0FBQyxFQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQWtCO1FBQy9ELElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ25CLElBQUksVUFBaUMsQ0FBQztZQUN0QyxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFFeEIsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUMxRSxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxHQUFHLFVBQVUsQ0FBQztnQkFDdkMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtvQkFDNUMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUVoQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTt3QkFDNUIsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ3RCO29CQUVELE9BQU8sU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDbEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7NEJBQ2YsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHOzRCQUN4QixLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQzt5QkFDMUIsQ0FBQzt3QkFDRixDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNULENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxPQUFPLFdBQVcsQ0FBQztTQUNwQjthQUFNLElBQUksTUFBTSxFQUFFO1lBQ2pCLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNuQixLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztvQkFDeEIsS0FBSyxFQUFFLEtBQXlCO29CQUNoQyxNQUFNO29CQUNOLFdBQVc7b0JBQ1gsR0FBRztpQkFDSixDQUFDLENBQUM7YUFDSjtpQkFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQy9CLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQzthQUM3RDtTQUNGO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BdUJHO0lBQ08sWUFBWSxDQUFDLEVBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBb0M7UUFDOUYsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBRW5CLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDaEMsMkNBQTJDO1lBQzNDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2hDLDJEQUEyRDtnQkFDM0QsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUMxQixvREFBb0Q7Z0JBQ3BELE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDM0IsV0FBVztnQkFDWCxHQUFHO2FBQUMsQ0FBQyxDQUFDO1lBRVIsNEJBQTRCO1lBQzVCLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFUyxXQUFXLENBQUMsRUFBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLEVBQTZCO1FBRWhFLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNyQyxLQUFLLEVBQUUsQ0FBQztZQUNSLEdBQUcsSUFBSTtTQUNSLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQzt1R0FqR1UsaUJBQWlCOzJHQUFqQixpQkFBaUI7OzJGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVU7O0FBcUdYLFNBQVMsY0FBYyxDQUFDLE1BQXVCO0lBQzdDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUUxQyxPQUFPLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxNQUFNLEtBQUssR0FBRyxHQUFHLE9BQU8sR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQU1ELE1BQU0sVUFBVSxlQUFlLENBQUMsVUFBa0I7SUFDaEQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDekQsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hDLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvQixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUN2QyxDQUFDLEVBQUUsQ0FBQztZQUNKLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ2xCO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBR0QsTUFBTSxPQUFPLG9CQUNYLFNBQVEsaUJBQWlCO0lBR2YsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV0QyxTQUFTLENBQUMsRUFBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLEVBQWtCO1FBQ3pDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNuQixVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FDeEIsNkJBQTZCLEVBQzdCLENBQUMsS0FBYSxFQUFFLFlBQW9CLEVBQUUsSUFBWSxFQUFFLEVBQUU7Z0JBQ3BELElBQUk7b0JBQ0YsTUFBTSxJQUFJLEdBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBRWxDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2lCQUNqRDtnQkFBQyxPQUFPLENBQU0sRUFBRTtvQkFDZixJQUFJLE9BQU8sR0FBRywwQkFBMEIsS0FBSzt3SEFDK0QsWUFBWSxjQUFjLENBQUM7b0JBQ3ZJLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRTt3QkFDM0MsT0FBTyxHQUFHLHNCQUFzQixZQUFZLDJEQUEyRCxDQUFDO3FCQUN6RztvQkFDRCxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUMxQjtZQUNILENBQUMsQ0FDRixDQUFDO1NBQ0g7UUFFRCxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxFQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO3VHQTlCVSxvQkFBb0I7MkdBQXBCLG9CQUFvQjs7MkZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIEluamVjdG9yLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSGFzaE1hcCwgVHJhbnNsYXRpb24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldFZhbHVlLCBpc0RlZmluZWQsIGlzT2JqZWN0LCBpc1N0cmluZywgc2V0VmFsdWUgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgZGVmYXVsdENvbmZpZyxcbiAgVFJBTlNMT0NPX0NPTkZJRyxcbiAgVHJhbnNsb2NvQ29uZmlnLFxufSBmcm9tICcuL3RyYW5zbG9jby5jb25maWcnO1xuXG5leHBvcnQgY29uc3QgVFJBTlNMT0NPX1RSQU5TUElMRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48VHJhbnNsb2NvVHJhbnNwaWxlcj4oXG4gICdUUkFOU0xPQ09fVFJBTlNQSUxFUidcbik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsb2NvVHJhbnNwaWxlciB7XG4gIHRyYW5zcGlsZShwYXJhbXM6IFRyYW5zcGlsZVBhcmFtcyk6IGFueTtcblxuICBvbkxhbmdDaGFuZ2VkPyhsYW5nOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcGlsZVBhcmFtczxWID0gdW5rbm93bj4ge1xuICB2YWx1ZTogVjtcbiAgcGFyYW1zPzogSGFzaE1hcDtcbiAgdHJhbnNsYXRpb246IFRyYW5zbGF0aW9uO1xuICBrZXk6IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlZmF1bHRUcmFuc3BpbGVyIGltcGxlbWVudHMgVHJhbnNsb2NvVHJhbnNwaWxlciB7XG4gIHByb3RlY3RlZCBjb25maWcgPSBpbmplY3QoVFJBTlNMT0NPX0NPTkZJRywge29wdGlvbmFsOiB0cnVlfSkgPz8gZGVmYXVsdENvbmZpZztcblxuICBwcm90ZWN0ZWQgZ2V0IGludGVycG9sYXRpb25NYXRjaGVyKCkge1xuICAgIHJldHVybiByZXNvbHZlTWF0Y2hlcih0aGlzLmNvbmZpZyk7XG4gIH1cbiAgXG4gIHRyYW5zcGlsZSh7dmFsdWUsIHBhcmFtcyA9IHt9LCB0cmFuc2xhdGlvbiwga2V5fTogVHJhbnNwaWxlUGFyYW1zKTogYW55IHtcbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICBsZXQgcGFyYW1NYXRjaDogUmVnRXhwRXhlY0FycmF5fCBudWxsO1xuICAgICAgbGV0IHBhcnNlZFZhbHVlID0gdmFsdWU7XG4gICAgICBcbiAgICAgIHdoaWxlICgocGFyYW1NYXRjaCA9IHRoaXMuaW50ZXJwb2xhdGlvbk1hdGNoZXIuZXhlYyhwYXJzZWRWYWx1ZSkpICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IFttYXRjaCwgcGFyYW1WYWx1ZV0gPSBwYXJhbU1hdGNoO1xuICAgICAgICBwYXJzZWRWYWx1ZSA9IHBhcnNlZFZhbHVlLnJlcGxhY2UobWF0Y2gsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IHBhcmFtVmFsdWUudHJpbSgpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChpc0RlZmluZWQocGFyYW1zW21hdGNoXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXNbbWF0Y2hdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBpc0RlZmluZWQodHJhbnNsYXRpb25bbWF0Y2hdKVxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zcGlsZSh7XG4gICAgICAgICAgICAgIHBhcmFtcywgdHJhbnNsYXRpb24sIGtleSxcbiAgICAgICAgICAgICAgdmFsdWU6IHRyYW5zbGF0aW9uW21hdGNoXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gcGFyc2VkVmFsdWU7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMpIHtcbiAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLmhhbmRsZU9iamVjdCh7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlIGFzIFJlY29yZDxhbnksIGFueT4sIFxuICAgICAgICAgIHBhcmFtcywgXG4gICAgICAgICAgdHJhbnNsYXRpb24sIFxuICAgICAgICAgIGtleVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLmhhbmRsZUFycmF5KHt2YWx1ZSwgcGFyYW1zLCB0cmFuc2xhdGlvbiwga2V5fSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGNvbnN0IGVuID0ge1xuICAgKiAgYToge1xuICAgKiAgICBiOiB7XG4gICAqICAgICAgYzogXCJIZWxsbyB7eyB2YWx1ZSB9fVwiXG4gICAqICAgIH1cbiAgICogIH1cbiAgICogfVxuICAgKlxuICAgKiBjb25zdCBwYXJhbXMgPSAge1xuICAgKiAgXCJiLmNcIjogeyB2YWx1ZTogXCJUcmFuc2xvY28gXCJ9XG4gICAqIH1cbiAgICpcbiAgICogc2VydmljZS5zZWxlY3RUcmFuc2xhdGUoJ2EnLCBwYXJhbXMpO1xuICAgKlxuICAgKiAvLyB0aGUgZmlyc3QgcGFyYW0gd2lsbCBiZSB0aGUgcmVzdWx0IG9mIGBlbi5hYC5cbiAgICogLy8gdGhlIHNlY29uZCBwYXJhbSB3aWxsIGJlIGBwYXJhbXNgLlxuICAgKiBwYXJzZXIudHJhbnNwaWxlKHZhbHVlLCBwYXJhbXMsIHt9KTtcbiAgICpcbiAgICpcbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVPYmplY3Qoe3ZhbHVlLCBwYXJhbXMgPSB7fSwgdHJhbnNsYXRpb24sIGtleX06IFRyYW5zcGlsZVBhcmFtczxSZWNvcmQ8YW55LCBhbnk+Pikge1xuICAgIGxldCByZXN1bHQgPSB2YWx1ZTtcblxuICAgIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgLy8gdHJhbnNwaWxlIHRoZSB2YWx1ZSA9PiBcIkhlbGxvIFRyYW5zbG9jb1wiXG4gICAgICBjb25zdCB0cmFuc3BpbGVkID0gdGhpcy50cmFuc3BpbGUoe1xuICAgICAgICAvLyBnZXQgdGhlIHZhbHVlIG9mIFwiYi5jXCIgaW5zaWRlIFwiYVwiID0+IFwiSGVsbG8ge3sgdmFsdWUgfX1cIlxuICAgICAgICB2YWx1ZTogZ2V0VmFsdWUocmVzdWx0LCBwKSxcbiAgICAgICAgLy8gZ2V0IHRoZSBwYXJhbXMgb2YgXCJiLmNcIiA9PiB7IHZhbHVlOiBcIlRyYW5zbG9jb1wiIH1cbiAgICAgICAgcGFyYW1zOiBnZXRWYWx1ZShwYXJhbXMsIHApLCBcbiAgICAgICAgdHJhbnNsYXRpb24sIFxuICAgICAgICBrZXl9KTtcblxuICAgICAgLy8gc2V0IFwiYi5jXCIgdG8gYHRyYW5zcGlsZWRgXG4gICAgICByZXN1bHQgPSBzZXRWYWx1ZShyZXN1bHQsIHAsIHRyYW5zcGlsZWQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVBcnJheSh7dmFsdWUsIC4uLnJlc3R9OiBUcmFuc3BpbGVQYXJhbXM8dW5rbm93bltdPlxuICApIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKCh2KSA9PiB0aGlzLnRyYW5zcGlsZSh7XG4gICAgICB2YWx1ZTogdixcbiAgICAgIC4uLnJlc3RcbiAgICB9KSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU1hdGNoZXIoY29uZmlnOiBUcmFuc2xvY29Db25maWcpOiBSZWdFeHAge1xuICBjb25zdCBbc3RhcnQsIGVuZF0gPSBjb25maWcuaW50ZXJwb2xhdGlvbjtcblxuICByZXR1cm4gbmV3IFJlZ0V4cChgJHtzdGFydH0oW14ke3N0YXJ0fSR7ZW5kfV0qPykke2VuZH1gLCAnZycpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbG9jb1RyYW5zcGlsZXJGdW5jdGlvbiB7XG4gIHRyYW5zcGlsZSguLi5hcmdzOiBzdHJpbmdbXSk6IGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bmN0aW9uQXJncyhhcmdzU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNwbGl0dGVkID0gYXJnc1N0cmluZyA/IGFyZ3NTdHJpbmcuc3BsaXQoJywnKSA6IFtdO1xuICBjb25zdCBhcmdzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXR0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgdmFsdWUgPSBzcGxpdHRlZFtpXS50cmltKCk7XG4gICAgd2hpbGUgKHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdID09PSAnXFxcXCcpIHtcbiAgICAgIGkrKztcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXFxcXCcsICcsJykgKyBzcGxpdHRlZFtpXTtcbiAgICB9XG4gICAgYXJncy5wdXNoKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBhcmdzO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25hbFRyYW5zcGlsZXJcbiAgZXh0ZW5kcyBEZWZhdWx0VHJhbnNwaWxlclxuICBpbXBsZW1lbnRzIFRyYW5zbG9jb1RyYW5zcGlsZXJcbntcbiAgcHJvdGVjdGVkIGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICB0cmFuc3BpbGUoe3ZhbHVlLCAuLi5yZXN0fTogVHJhbnNwaWxlUGFyYW1zKSB7XG4gICAgbGV0IHRyYW5zcGlsZWQgPSB2YWx1ZTtcbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICB0cmFuc3BpbGVkID0gdmFsdWUucmVwbGFjZShcbiAgICAgICAgL1xcW1xcW1xccyooXFx3KylcXCgoLio/KVxcKVxccypdXS9nLFxuICAgICAgICAobWF0Y2g6IHN0cmluZywgZnVuY3Rpb25OYW1lOiBzdHJpbmcsIGFyZ3M6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmdW5jOiBUcmFuc2xvY29UcmFuc3BpbGVyRnVuY3Rpb24gPVxuICAgICAgICAgICAgICB0aGlzLmluamVjdG9yLmdldChmdW5jdGlvbk5hbWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gZnVuYy50cmFuc3BpbGUoLi4uZ2V0RnVuY3Rpb25BcmdzKGFyZ3MpKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYFRoZXJlIGlzIGFuIGVycm9yIGluOiAnJHt2YWx1ZX0nLiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhhdCB0aGUgeW91IHVzZWQgdGhlIHJpZ2h0IHN5bnRheCBpbiB5b3VyIHRyYW5zbGF0aW9uIGFuZCB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiAke2Z1bmN0aW9uTmFtZX0gaXMgY29ycmVjdC5gO1xuICAgICAgICAgICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcygnTnVsbEluamVjdG9yRXJyb3InKSkge1xuICAgICAgICAgICAgICBtZXNzYWdlID0gYFlvdSBhcmUgdXNpbmcgdGhlICcke2Z1bmN0aW9uTmFtZX0nIGZ1bmN0aW9uIGluIHlvdXIgdHJhbnNsYXRpb24gYnV0IG5vIHByb3ZpZGVyIHdhcyBmb3VuZCFgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIudHJhbnNwaWxlKHt2YWx1ZTogdHJhbnNwaWxlZCwgLi4ucmVzdH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3RyYW5zbG9jby9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBIYXNoTWFwPFQgPSBhbnk+ID0gUmVjb3JkPHN0cmluZywgVD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGVkRXZlbnQge1xuICB0eXBlOiAndHJhbnNsYXRpb25Mb2FkU3VjY2Vzcyc7XG4gIHdhc0ZhaWx1cmU6IGJvb2xlYW47XG4gIHBheWxvYWQ6IHtcbiAgICBzY29wZTogc3RyaW5nIHwgbnVsbDtcbiAgICBsYW5nTmFtZTogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZhaWxlZEV2ZW50IHtcbiAgdHlwZTogJ3RyYW5zbGF0aW9uTG9hZEZhaWx1cmUnO1xuICBwYXlsb2FkOiBMb2FkZWRFdmVudFsncGF5bG9hZCddO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhbmdDaGFuZ2VkRXZlbnQge1xuICB0eXBlOiAnbGFuZ0NoYW5nZWQnO1xuICBwYXlsb2FkOiBMb2FkZWRFdmVudFsncGF5bG9hZCddO1xufVxuXG5leHBvcnQgdHlwZSBUcmFuc2xvY29FdmVudHMgPSBMb2FkZWRFdmVudCB8IEZhaWxlZEV2ZW50IHwgTGFuZ0NoYW5nZWRFdmVudDtcbmV4cG9ydCB0eXBlIFRyYW5zbGF0aW9uID0gSGFzaE1hcDtcbmV4cG9ydCB0eXBlIFRyYW5zbGF0ZVBhcmFtcyA9IHN0cmluZyB8IHN0cmluZ1tdO1xuZXhwb3J0IHR5cGUgVHJhbnNsYXRlT2JqZWN0UGFyYW1zID1cbiAgfCBUcmFuc2xhdGVQYXJhbXNcbiAgfCBIYXNoTWFwXG4gIHwgTWFwPHN0cmluZywgSGFzaE1hcD47XG5leHBvcnQgaW50ZXJmYWNlIExhbmdEZWZpbml0aW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbn1cbmV4cG9ydCB0eXBlIEF2YWlsYWJsZUxhbmdzID0gc3RyaW5nW10gfCBMYW5nRGVmaW5pdGlvbltdO1xuZXhwb3J0IGludGVyZmFjZSBTZXRUcmFuc2xhdGlvbk9wdGlvbnMge1xuICBsYW5nPzogc3RyaW5nO1xuICBtZXJnZT86IGJvb2xlYW47XG4gIGVtaXRDaGFuZ2U/OiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlclNjb3BlIHtcbiAgc2NvcGU6IHN0cmluZztcbiAgbG9hZGVyPzogSW5saW5lTG9hZGVyO1xuICBhbGlhcz86IHN0cmluZztcbn1cbmV4cG9ydCB0eXBlIE9yQXJyYXk8VD4gPSBUIHwgVFtdO1xuZXhwb3J0IHR5cGUgVHJhbnNsb2NvU2NvcGUgPSBQcm92aWRlclNjb3BlIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuZXhwb3J0IHR5cGUgSW5saW5lTG9hZGVyID0gSGFzaE1hcDwoKSA9PiBQcm9taXNlPFRyYW5zbGF0aW9uPj47XG5leHBvcnQgaW50ZXJmYWNlIExvYWRPcHRpb25zIHtcbiAgZmFsbGJhY2tMYW5ncz86IHN0cmluZ1tdIHwgbnVsbDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBmYWlsZWRDb3VudGVyPzogbnVtYmVyO1xuICBpbmxpbmVMb2FkZXI/OiBJbmxpbmVMb2FkZXI7XG59XG4iXX0=