@angular/localize 19.0.0-next.1 → 19.0.0-next.10
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.
- package/LICENSE +21 -0
- package/fesm2022/init.mjs +1 -1
- package/fesm2022/init.mjs.map +1 -1
- package/fesm2022/localize.mjs +2 -2
- package/fesm2022/localize.mjs.map +1 -1
- package/index.d.ts +1 -1
- package/init/index.d.ts +1 -1
- package/package.json +3 -8
- package/schematics/ng-add/ng_add_bundle.js +6 -5
- package/schematics/ng-add/ng_add_bundle.js.map +2 -2
- package/schematics/ng-add/schema.json +0 -5
- package/tools/bundles/{chunk-IO35W7IH.js → chunk-P52LUQCG.js} +19 -19
- package/tools/bundles/{chunk-BXL2U6FQ.js → chunk-P5UMW3G2.js} +19 -19
- package/tools/bundles/{chunk-BXL2U6FQ.js.map → chunk-P5UMW3G2.js.map} +1 -1
- package/tools/bundles/{chunk-OWGLQY27.js → chunk-YINHXBYF.js} +4 -4
- package/tools/bundles/index.js +5 -5
- package/tools/bundles/src/extract/cli.js +6 -6
- package/tools/bundles/src/migrate/cli.js +6 -6
- package/tools/bundles/src/translate/cli.js +12 -12
- package/tools/bundles_metadata.json +1 -1
- package/tools/index.d.ts +1 -1
- package/tools/src/diagnostics.d.ts +1 -1
- package/tools/src/extract/cli.d.ts +1 -1
- package/tools/src/extract/duplicates.d.ts +1 -1
- package/tools/src/extract/extraction.d.ts +1 -1
- package/tools/src/extract/index.d.ts +1 -1
- package/tools/src/extract/source_files/es2015_extract_plugin.d.ts +1 -1
- package/tools/src/extract/source_files/es5_extract_plugin.d.ts +1 -1
- package/tools/src/extract/translation_files/arb_translation_serializer.d.ts +1 -1
- package/tools/src/extract/translation_files/format_options.d.ts +1 -1
- package/tools/src/extract/translation_files/icu_parsing.d.ts +1 -1
- package/tools/src/extract/translation_files/json_translation_serializer.d.ts +1 -1
- package/tools/src/extract/translation_files/legacy_message_id_migration_serializer.d.ts +1 -1
- package/tools/src/extract/translation_files/translation_serializer.d.ts +1 -1
- package/tools/src/extract/translation_files/utils.d.ts +1 -1
- package/tools/src/extract/translation_files/xliff1_translation_serializer.d.ts +1 -1
- package/tools/src/extract/translation_files/xliff2_translation_serializer.d.ts +1 -1
- package/tools/src/extract/translation_files/xmb_translation_serializer.d.ts +1 -1
- package/tools/src/extract/translation_files/xml_file.d.ts +1 -1
- package/tools/src/migrate/cli.d.ts +1 -1
- package/tools/src/migrate/index.d.ts +1 -1
- package/tools/src/migrate/migrate.d.ts +1 -1
- package/tools/src/source_file_utils.d.ts +1 -1
- package/tools/src/translate/asset_files/asset_translation_handler.d.ts +1 -1
- package/tools/src/translate/output_path.d.ts +1 -1
- package/tools/src/translate/source_files/es2015_translate_plugin.d.ts +1 -1
- package/tools/src/translate/source_files/es5_translate_plugin.d.ts +1 -1
- package/tools/src/translate/source_files/locale_plugin.d.ts +1 -1
- package/tools/src/translate/source_files/source_file_translation_handler.d.ts +1 -1
- package/tools/src/translate/translation_files/base_visitor.d.ts +1 -1
- package/tools/src/translate/translation_files/message_serialization/message_renderer.d.ts +1 -1
- package/tools/src/translate/translation_files/message_serialization/message_serializer.d.ts +1 -1
- package/tools/src/translate/translation_files/message_serialization/target_message_renderer.d.ts +1 -1
- package/tools/src/translate/translation_files/translation_loader.d.ts +1 -1
- package/tools/src/translate/translation_files/translation_parsers/arb_translation_parser.d.ts +1 -1
- package/tools/src/translate/translation_files/translation_parsers/serialize_translation_message.d.ts +1 -1
- package/tools/src/translate/translation_files/translation_parsers/translation_parse_error.d.ts +1 -1
- package/tools/src/translate/translation_files/translation_parsers/translation_parser.d.ts +1 -1
- package/tools/src/translate/translation_files/translation_parsers/translation_utils.d.ts +1 -1
- package/tools/src/translate/translator.d.ts +1 -1
- package/esm2022/index.mjs +0 -12
- package/esm2022/init/index.mjs +0 -12
- package/esm2022/localize.mjs +0 -12
- package/esm2022/private.mjs +0 -12
- package/esm2022/src/localize/doc_index.mjs +0 -9
- package/esm2022/src/localize/index.mjs +0 -9
- package/esm2022/src/localize/src/localize.mjs +0 -136
- package/esm2022/src/translate.mjs +0 -81
- package/esm2022/src/utils/index.mjs +0 -11
- package/esm2022/src/utils/src/constants.mjs +0 -58
- package/esm2022/src/utils/src/messages.mjs +0 -193
- package/esm2022/src/utils/src/translations.mjs +0 -119
- /package/tools/bundles/{chunk-IO35W7IH.js.map → chunk-P52LUQCG.js.map} +0 -0
- /package/tools/bundles/{chunk-OWGLQY27.js.map → chunk-YINHXBYF.js.map} +0 -0
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
// This module specifier is intentionally a relative path to allow bundling the code directly
|
|
9
|
-
// into the package.
|
|
10
|
-
// @ng_package: ignore-cross-repo-import
|
|
11
|
-
import { computeMsgId } from '../../../../compiler/src/i18n/digest';
|
|
12
|
-
import { BLOCK_MARKER, ID_SEPARATOR, LEGACY_ID_INDICATOR, MEANING_SEPARATOR } from './constants';
|
|
13
|
-
/**
|
|
14
|
-
* Re-export this helper function so that users of `@angular/localize` don't need to actively import
|
|
15
|
-
* from `@angular/compiler`.
|
|
16
|
-
*/
|
|
17
|
-
export { computeMsgId };
|
|
18
|
-
/**
|
|
19
|
-
* Parse a `$localize` tagged string into a structure that can be used for translation or
|
|
20
|
-
* extraction.
|
|
21
|
-
*
|
|
22
|
-
* See `ParsedMessage` for an example.
|
|
23
|
-
*/
|
|
24
|
-
export function parseMessage(messageParts, expressions, location, messagePartLocations, expressionLocations = []) {
|
|
25
|
-
const substitutions = {};
|
|
26
|
-
const substitutionLocations = {};
|
|
27
|
-
const associatedMessageIds = {};
|
|
28
|
-
const metadata = parseMetadata(messageParts[0], messageParts.raw[0]);
|
|
29
|
-
const cleanedMessageParts = [metadata.text];
|
|
30
|
-
const placeholderNames = [];
|
|
31
|
-
let messageString = metadata.text;
|
|
32
|
-
for (let i = 1; i < messageParts.length; i++) {
|
|
33
|
-
const { messagePart, placeholderName = computePlaceholderName(i), associatedMessageId, } = parsePlaceholder(messageParts[i], messageParts.raw[i]);
|
|
34
|
-
messageString += `{$${placeholderName}}${messagePart}`;
|
|
35
|
-
if (expressions !== undefined) {
|
|
36
|
-
substitutions[placeholderName] = expressions[i - 1];
|
|
37
|
-
substitutionLocations[placeholderName] = expressionLocations[i - 1];
|
|
38
|
-
}
|
|
39
|
-
placeholderNames.push(placeholderName);
|
|
40
|
-
if (associatedMessageId !== undefined) {
|
|
41
|
-
associatedMessageIds[placeholderName] = associatedMessageId;
|
|
42
|
-
}
|
|
43
|
-
cleanedMessageParts.push(messagePart);
|
|
44
|
-
}
|
|
45
|
-
const messageId = metadata.customId || computeMsgId(messageString, metadata.meaning || '');
|
|
46
|
-
const legacyIds = metadata.legacyIds ? metadata.legacyIds.filter((id) => id !== messageId) : [];
|
|
47
|
-
return {
|
|
48
|
-
id: messageId,
|
|
49
|
-
legacyIds,
|
|
50
|
-
substitutions,
|
|
51
|
-
substitutionLocations,
|
|
52
|
-
text: messageString,
|
|
53
|
-
customId: metadata.customId,
|
|
54
|
-
meaning: metadata.meaning || '',
|
|
55
|
-
description: metadata.description || '',
|
|
56
|
-
messageParts: cleanedMessageParts,
|
|
57
|
-
messagePartLocations,
|
|
58
|
-
placeholderNames,
|
|
59
|
-
associatedMessageIds,
|
|
60
|
-
location,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Parse the given message part (`cooked` + `raw`) to extract the message metadata from the text.
|
|
65
|
-
*
|
|
66
|
-
* If the message part has a metadata block this function will extract the `meaning`,
|
|
67
|
-
* `description`, `customId` and `legacyId` (if provided) from the block. These metadata properties
|
|
68
|
-
* are serialized in the string delimited by `|`, `@@` and `␟` respectively.
|
|
69
|
-
*
|
|
70
|
-
* (Note that `␟` is the `LEGACY_ID_INDICATOR` - see `constants.ts`.)
|
|
71
|
-
*
|
|
72
|
-
* For example:
|
|
73
|
-
*
|
|
74
|
-
* ```ts
|
|
75
|
-
* `:meaning|description@@custom-id:`
|
|
76
|
-
* `:meaning|@@custom-id:`
|
|
77
|
-
* `:meaning|description:`
|
|
78
|
-
* `:description@@custom-id:`
|
|
79
|
-
* `:meaning|:`
|
|
80
|
-
* `:description:`
|
|
81
|
-
* `:@@custom-id:`
|
|
82
|
-
* `:meaning|description@@custom-id␟legacy-id-1␟legacy-id-2:`
|
|
83
|
-
* ```
|
|
84
|
-
*
|
|
85
|
-
* @param cooked The cooked version of the message part to parse.
|
|
86
|
-
* @param raw The raw version of the message part to parse.
|
|
87
|
-
* @returns A object containing any metadata that was parsed from the message part.
|
|
88
|
-
*/
|
|
89
|
-
export function parseMetadata(cooked, raw) {
|
|
90
|
-
const { text: messageString, block } = splitBlock(cooked, raw);
|
|
91
|
-
if (block === undefined) {
|
|
92
|
-
return { text: messageString };
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
const [meaningDescAndId, ...legacyIds] = block.split(LEGACY_ID_INDICATOR);
|
|
96
|
-
const [meaningAndDesc, customId] = meaningDescAndId.split(ID_SEPARATOR, 2);
|
|
97
|
-
let [meaning, description] = meaningAndDesc.split(MEANING_SEPARATOR, 2);
|
|
98
|
-
if (description === undefined) {
|
|
99
|
-
description = meaning;
|
|
100
|
-
meaning = undefined;
|
|
101
|
-
}
|
|
102
|
-
if (description === '') {
|
|
103
|
-
description = undefined;
|
|
104
|
-
}
|
|
105
|
-
return { text: messageString, meaning, description, customId, legacyIds };
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Parse the given message part (`cooked` + `raw`) to extract any placeholder metadata from the
|
|
110
|
-
* text.
|
|
111
|
-
*
|
|
112
|
-
* If the message part has a metadata block this function will extract the `placeholderName` and
|
|
113
|
-
* `associatedMessageId` (if provided) from the block.
|
|
114
|
-
*
|
|
115
|
-
* These metadata properties are serialized in the string delimited by `@@`.
|
|
116
|
-
*
|
|
117
|
-
* For example:
|
|
118
|
-
*
|
|
119
|
-
* ```ts
|
|
120
|
-
* `:placeholder-name@@associated-id:`
|
|
121
|
-
* ```
|
|
122
|
-
*
|
|
123
|
-
* @param cooked The cooked version of the message part to parse.
|
|
124
|
-
* @param raw The raw version of the message part to parse.
|
|
125
|
-
* @returns A object containing the metadata (`placeholderName` and `associatedMessageId`) of the
|
|
126
|
-
* preceding placeholder, along with the static text that follows.
|
|
127
|
-
*/
|
|
128
|
-
export function parsePlaceholder(cooked, raw) {
|
|
129
|
-
const { text: messagePart, block } = splitBlock(cooked, raw);
|
|
130
|
-
if (block === undefined) {
|
|
131
|
-
return { messagePart };
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
const [placeholderName, associatedMessageId] = block.split(ID_SEPARATOR);
|
|
135
|
-
return { messagePart, placeholderName, associatedMessageId };
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Split a message part (`cooked` + `raw`) into an optional delimited "block" off the front and the
|
|
140
|
-
* rest of the text of the message part.
|
|
141
|
-
*
|
|
142
|
-
* Blocks appear at the start of message parts. They are delimited by a colon `:` character at the
|
|
143
|
-
* start and end of the block.
|
|
144
|
-
*
|
|
145
|
-
* If the block is in the first message part then it will be metadata about the whole message:
|
|
146
|
-
* meaning, description, id. Otherwise it will be metadata about the immediately preceding
|
|
147
|
-
* substitution: placeholder name.
|
|
148
|
-
*
|
|
149
|
-
* Since blocks are optional, it is possible that the content of a message block actually starts
|
|
150
|
-
* with a block marker. In this case the marker must be escaped `\:`.
|
|
151
|
-
*
|
|
152
|
-
* @param cooked The cooked version of the message part to parse.
|
|
153
|
-
* @param raw The raw version of the message part to parse.
|
|
154
|
-
* @returns An object containing the `text` of the message part and the text of the `block`, if it
|
|
155
|
-
* exists.
|
|
156
|
-
* @throws an error if the `block` is unterminated
|
|
157
|
-
*/
|
|
158
|
-
export function splitBlock(cooked, raw) {
|
|
159
|
-
if (raw.charAt(0) !== BLOCK_MARKER) {
|
|
160
|
-
return { text: cooked };
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
const endOfBlock = findEndOfBlock(cooked, raw);
|
|
164
|
-
return {
|
|
165
|
-
block: cooked.substring(1, endOfBlock),
|
|
166
|
-
text: cooked.substring(endOfBlock + 1),
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
function computePlaceholderName(index) {
|
|
171
|
-
return index === 1 ? 'PH' : `PH_${index - 1}`;
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Find the end of a "marked block" indicated by the first non-escaped colon.
|
|
175
|
-
*
|
|
176
|
-
* @param cooked The cooked string (where escaped chars have been processed)
|
|
177
|
-
* @param raw The raw string (where escape sequences are still in place)
|
|
178
|
-
*
|
|
179
|
-
* @returns the index of the end of block marker
|
|
180
|
-
* @throws an error if the block is unterminated
|
|
181
|
-
*/
|
|
182
|
-
export function findEndOfBlock(cooked, raw) {
|
|
183
|
-
for (let cookedIndex = 1, rawIndex = 1; cookedIndex < cooked.length; cookedIndex++, rawIndex++) {
|
|
184
|
-
if (raw[rawIndex] === '\\') {
|
|
185
|
-
rawIndex++;
|
|
186
|
-
}
|
|
187
|
-
else if (cooked[cookedIndex] === BLOCK_MARKER) {
|
|
188
|
-
return cookedIndex;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
throw new Error(`Unterminated $localize metadata block in "${raw}".`);
|
|
192
|
-
}
|
|
193
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9sb2NhbGl6ZS9zcmMvdXRpbHMvc3JjL21lc3NhZ2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILDZGQUE2RjtBQUM3RixvQkFBb0I7QUFDcEIsd0NBQXdDO0FBQ3hDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUVsRSxPQUFPLEVBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvRjs7O0dBR0c7QUFDSCxPQUFPLEVBQUMsWUFBWSxFQUFDLENBQUM7QUFrSnRCOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDMUIsWUFBa0MsRUFDbEMsV0FBNEIsRUFDNUIsUUFBeUIsRUFDekIsb0JBQXFELEVBQ3JELHNCQUFzRCxFQUFFO0lBRXhELE1BQU0sYUFBYSxHQUFxQyxFQUFFLENBQUM7SUFDM0QsTUFBTSxxQkFBcUIsR0FBNEQsRUFBRSxDQUFDO0lBQzFGLE1BQU0sb0JBQW9CLEdBQTJDLEVBQUUsQ0FBQztJQUN4RSxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRSxNQUFNLG1CQUFtQixHQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELE1BQU0sZ0JBQWdCLEdBQWEsRUFBRSxDQUFDO0lBQ3RDLElBQUksYUFBYSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3QyxNQUFNLEVBQ0osV0FB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QUFDLEtBQWE7SUFDM0MsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ2hELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBYyxFQUFFLEdBQVc7SUFDeEQsS0FBSyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDO1FBQy9GLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzNCLFFBQVEsRUFBRSxDQUFDO1FBQ2IsQ0FBQzthQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ2hELE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG4vLyBUaGlzIG1vZHVsZSBzcGVjaWZpZXIgaXMgaW50ZW50aW9uYWxseSBhIHJlbGF0aXZlIHBhdGggdG8gYWxsb3cgYnVuZGxpbmcgdGhlIGNvZGUgZGlyZWN0bHlcbi8vIGludG8gdGhlIHBhY2thZ2UuXG4vLyBAbmdfcGFja2FnZTogaWdub3JlLWNyb3NzLXJlcG8taW1wb3J0XG5pbXBvcnQge2NvbXB1dGVNc2dJZH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcGlsZXIvc3JjL2kxOG4vZGlnZXN0JztcblxuaW1wb3J0IHtCTE9DS19NQVJLRVIsIElEX1NFUEFSQVRPUiwgTEVHQUNZX0lEX0lORElDQVRPUiwgTUVBTklOR19TRVBBUkFUT1J9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBSZS1leHBvcnQgdGhpcyBoZWxwZXIgZnVuY3Rpb24gc28gdGhhdCB1c2VycyBvZiBgQGFuZ3VsYXIvbG9jYWxpemVgIGRvbid0IG5lZWQgdG8gYWN0aXZlbHkgaW1wb3J0XG4gKiBmcm9tIGBAYW5ndWxhci9jb21waWxlcmAuXG4gKi9cbmV4cG9ydCB7Y29tcHV0ZU1zZ0lkfTtcblxuLyoqXG4gKiBBIHN0cmluZyBjb250YWluaW5nIGEgdHJhbnNsYXRpb24gc291cmNlIG1lc3NhZ2UuXG4gKlxuICogSS5FLiB0aGUgbWVzc2FnZSB0aGF0IGluZGljYXRlcyB3aGF0IHdpbGwgYmUgdHJhbnNsYXRlZCBmcm9tLlxuICpcbiAqIFVzZXMgYHskcGxhY2Vob2xkZXItbmFtZX1gIHRvIGluZGljYXRlIGEgcGxhY2Vob2xkZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFNvdXJjZU1lc3NhZ2UgPSBzdHJpbmc7XG5cbi8qKlxuICogQSBzdHJpbmcgY29udGFpbmluZyBhIHRyYW5zbGF0aW9uIHRhcmdldCBtZXNzYWdlLlxuICpcbiAqIEkuRS4gdGhlIG1lc3NhZ2UgdGhhdCBpbmRpY2F0ZXMgd2hhdCB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8uXG4gKlxuICogVXNlcyBgeyRwbGFjZWhvbGRlci1uYW1lfWAgdG8gaW5kaWNhdGUgYSBwbGFjZWhvbGRlci5cbiAqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCB0eXBlIFRhcmdldE1lc3NhZ2UgPSBzdHJpbmc7XG5cbi8qKlxuICogQSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGEgbWVzc2FnZSwgdG8gYmUgdXNlZCBmb3IgbWF0Y2hpbmcgdHJhbnNsYXRpb25zLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZUlkID0gc3RyaW5nO1xuXG4vKipcbiAqIERlY2xhcmVzIGEgY29weSBvZiB0aGUgYEFic29sdXRlRnNQYXRoYCBicmFuZGVkIHR5cGUgaW4gYEBhbmd1bGFyL2NvbXBpbGVyLWNsaWAgdG8gYXZvaWQgYW5cbiAqIGltcG9ydCBpbnRvIGBAYW5ndWxhci9jb21waWxlci1jbGlgLiBUaGUgY29tcGlsZXItY2xpJ3MgZGVjbGFyYXRpb24gZmlsZXMgYXJlIG5vdCBuZWNlc3NhcmlseVxuICogY29tcGF0aWJsZSB3aXRoIHdlYiBlbnZpcm9ubWVudHMgdGhhdCB1c2UgYEBhbmd1bGFyL2xvY2FsaXplYCwgYW5kIHdvdWxkIGluYWR2ZXJ0ZW50bHkgaW5jbHVkZVxuICogYHR5cGVzY3JpcHRgIGRlY2xhcmF0aW9uIGZpbGVzIGluIGFueSBjb21waWxhdGlvbiB1bml0IHRoYXQgdXNlcyBgQGFuZ3VsYXIvbG9jYWxpemVgICh3aGljaFxuICogaW5jcmVhc2VzIHBhcnNpbmcgdGltZSBhbmQgbWVtb3J5IHVzYWdlIGR1cmluZyBidWlsZHMpIHVzaW5nIGEgZGVmYXVsdCBpbXBvcnQgdGhhdCBvbmx5XG4gKiB0eXBlLWNoZWNrcyB3aGVuIGBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzYCBpcyBlbmFibGVkLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvNDUxNzlcbiAqL1xudHlwZSBBYnNvbHV0ZUZzUGF0aExvY2FsaXplQ29weSA9IHN0cmluZyAmIHtfYnJhbmQ6ICdBYnNvbHV0ZUZzUGF0aCd9O1xuXG4vKipcbiAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgc291cmNlIGZpbGUuXG4gKlxuICogVGhlIGBsaW5lYCBhbmQgYGNvbHVtbmAgdmFsdWVzIGZvciB0aGUgYHN0YXJ0YCBhbmQgYGVuZGAgcHJvcGVydGllcyBhcmUgemVyby1iYXNlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb3VyY2VMb2NhdGlvbiB7XG4gIHN0YXJ0OiB7bGluZTogbnVtYmVyOyBjb2x1bW46IG51bWJlcn07XG4gIGVuZDoge2xpbmU6IG51bWJlcjsgY29sdW1uOiBudW1iZXJ9O1xuICBmaWxlOiBBYnNvbHV0ZUZzUGF0aExvY2FsaXplQ29weTtcbiAgdGV4dD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZU1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIEEgaHVtYW4gcmVhZGFibGUgcmVuZGVyaW5nIG9mIHRoZSBtZXNzYWdlXG4gICAqL1xuICB0ZXh0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMZWdhY3kgbWVzc2FnZSBpZHMsIGlmIHByb3ZpZGVkLlxuICAgKlxuICAgKiBJbiBsZWdhY3kgbWVzc2FnZSBmb3JtYXRzIHRoZSBtZXNzYWdlIGlkIGNhbiBvbmx5IGJlIGNvbXB1dGVkIGRpcmVjdGx5IGZyb20gdGhlIG9yaWdpbmFsXG4gICAqIHRlbXBsYXRlIHNvdXJjZS5cbiAgICpcbiAgICogU2luY2UgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIGAkbG9jYWxpemVgIGNhbGxzLCB0aGUgbGVnYWN5IG1lc3NhZ2UgaWRzIG1heSBiZVxuICAgKiBhdHRhY2hlZCBieSB0aGUgY29tcGlsZXIgdG8gdGhlIGAkbG9jYWxpemVgIG1ldGFibG9jayBzbyBpdCBjYW4gYmUgdXNlZCBpZiBuZWVkZWQgYXQgdGhlIHBvaW50XG4gICAqIG9mIHRyYW5zbGF0aW9uIGlmIHRoZSB0cmFuc2xhdGlvbnMgYXJlIGVuY29kZWQgdXNpbmcgdGhlIGxlZ2FjeSBtZXNzYWdlIGlkLlxuICAgKi9cbiAgbGVnYWN5SWRzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIGBtZXNzYWdlYCBpZiBhIGN1c3RvbSBvbmUgd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5LlxuICAgKlxuICAgKiBUaGlzIGlkIG92ZXJyaWRlcyBhbnkgY29tcHV0ZWQgb3IgbGVnYWN5IGlkcy5cbiAgICovXG4gIGN1c3RvbUlkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG1lYW5pbmcgb2YgdGhlIGBtZXNzYWdlYCwgdXNlZCB0byBkaXN0aW5ndWlzaCBpZGVudGljYWwgYG1lc3NhZ2VTdHJpbmdgcy5cbiAgICovXG4gIG1lYW5pbmc/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGBtZXNzYWdlYCwgdXNlZCB0byBhaWQgdHJhbnNsYXRpb24uXG4gICAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgc291cmNlLlxuICAgKi9cbiAgbG9jYXRpb24/OiBTb3VyY2VMb2NhdGlvbjtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBwYXJzZWQgZnJvbSBhIGAkbG9jYWxpemVgIHRhZ2dlZCBzdHJpbmcgdGhhdCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSBpdC5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBcbiAqIGNvbnN0IG5hbWUgPSAnSm8gQmxvZ2dzJztcbiAqICRsb2NhbGl6ZWBIZWxsbyAke25hbWV9OnRpdGxlQEBJRDohYDtcbiAqIGBgYFxuICpcbiAqIE1heSBiZSBwYXJzZWQgaW50bzpcbiAqXG4gKiBgYGBcbiAqIHtcbiAqICAgaWQ6ICc2OTk4MTk0NTA3NTk3NzMwNTkxJyxcbiAqICAgc3Vic3RpdHV0aW9uczogeyB0aXRsZTogJ0pvIEJsb2dncycgfSxcbiAqICAgbWVzc2FnZVN0cmluZzogJ0hlbGxvIHskdGl0bGV9IScsXG4gKiAgIHBsYWNlaG9sZGVyTmFtZXM6IFsndGl0bGUnXSxcbiAqICAgYXNzb2NpYXRlZE1lc3NhZ2VJZHM6IHsgdGl0bGU6ICdJRCcgfSxcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlTWV0YWRhdGEge1xuICAvKipcbiAgICogVGhlIGtleSB1c2VkIHRvIGxvb2sgdXAgdGhlIGFwcHJvcHJpYXRlIHRyYW5zbGF0aW9uIHRhcmdldC5cbiAgICovXG4gIGlkOiBNZXNzYWdlSWQ7XG4gIC8qKlxuICAgKiBBIG1hcHBpbmcgb2YgcGxhY2Vob2xkZXIgbmFtZXMgdG8gc3Vic3RpdHV0aW9uIHZhbHVlcy5cbiAgICovXG4gIHN1YnN0aXR1dGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBtYXBwaW5nIG9mIHBsYWNlaG9sZGVyIG5hbWVzIHRvIGFzc29jaWF0ZWQgTWVzc2FnZUlkcy5cbiAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBtYXRjaCBJQ1UgcGxhY2Vob2xkZXJzIHRvIHRoZSBtZXNzYWdlIHRoYXQgY29udGFpbnMgdGhlIElDVS5cbiAgICovXG4gIGFzc29jaWF0ZWRNZXNzYWdlSWRzPzogUmVjb3JkPHN0cmluZywgTWVzc2FnZUlkPjtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIG1hcHBpbmcgb2YgcGxhY2Vob2xkZXIgbmFtZXMgdG8gc291cmNlIGxvY2F0aW9uc1xuICAgKi9cbiAgc3Vic3RpdHV0aW9uTG9jYXRpb25zPzogUmVjb3JkPHN0cmluZywgU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogVGhlIHN0YXRpYyBwYXJ0cyBvZiB0aGUgbWVzc2FnZS5cbiAgICovXG4gIG1lc3NhZ2VQYXJ0czogc3RyaW5nW107XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBtYXBwaW5nIG9mIG1lc3NhZ2UgcGFydHMgdG8gc291cmNlIGxvY2F0aW9uc1xuICAgKi9cbiAgbWVzc2FnZVBhcnRMb2NhdGlvbnM/OiAoU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQpW107XG4gIC8qKlxuICAgKiBUaGUgbmFtZXMgb2YgdGhlIHBsYWNlaG9sZGVycyB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBzdWJzdGl0dXRpb25zLlxuICAgKi9cbiAgcGxhY2Vob2xkZXJOYW1lczogc3RyaW5nW107XG59XG5cbi8qKlxuICogUGFyc2UgYSBgJGxvY2FsaXplYCB0YWdnZWQgc3RyaW5nIGludG8gYSBzdHJ1Y3R1cmUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdHJhbnNsYXRpb24gb3JcbiAqIGV4dHJhY3Rpb24uXG4gKlxuICogU2VlIGBQYXJzZWRNZXNzYWdlYCBmb3IgYW4gZXhhbXBsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTWVzc2FnZShcbiAgbWVzc2FnZVBhcnRzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgZXhwcmVzc2lvbnM/OiByZWFkb25seSBhbnlbXSxcbiAgbG9jYXRpb24/OiBTb3VyY2VMb2NhdGlvbixcbiAgbWVzc2FnZVBhcnRMb2NhdGlvbnM/OiAoU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQpW10sXG4gIGV4cHJlc3Npb25Mb2NhdGlvbnM6IChTb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZClbXSA9IFtdLFxuKTogUGFyc2VkTWVzc2FnZSB7XG4gIGNvbnN0IHN1YnN0aXR1dGlvbnM6IHtbcGxhY2Vob2xkZXJOYW1lOiBzdHJpbmddOiBhbnl9ID0ge307XG4gIGNvbnN0IHN1YnN0aXR1dGlvbkxvY2F0aW9uczoge1twbGFjZWhvbGRlck5hbWU6IHN0cmluZ106IFNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkfSA9IHt9O1xuICBjb25zdCBhc3NvY2lhdGVkTWVzc2FnZUlkczoge1twbGFjZWhvbGRlck5hbWU6IHN0cmluZ106IE1lc3NhZ2VJZH0gPSB7fTtcbiAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZU1ldGFkYXRhKG1lc3NhZ2VQYXJ0c1swXSwgbWVzc2FnZVBhcnRzLnJhd1swXSk7XG4gIGNvbnN0IGNsZWFuZWRNZXNzYWdlUGFydHM6IHN0cmluZ1tdID0gW21ldGFkYXRhLnRleHRdO1xuICBjb25zdCBwbGFjZWhvbGRlck5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgbWVzc2FnZVN0cmluZyA9IG1ldGFkYXRhLnRleHQ7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbWVzc2FnZVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVzc2FnZVBhcnQsXG4gICAgICBwbGFjZWhvbGRlck5hbWUgPSBjb21wdXRlUGxhY2Vob2xkZXJOYW1lKGkpLFxuICAgICAgYXNzb2NpYXRlZE1lc3NhZ2VJZCxcbiAgICB9ID0gcGFyc2VQbGFjZWhvbGRlcihtZXNzYWdlUGFydHNbaV0sIG1lc3NhZ2VQYXJ0cy5yYXdbaV0pO1xuICAgIG1lc3NhZ2VTdHJpbmcgKz0gYHskJHtwbGFjZWhvbGRlck5hbWV9fSR7bWVzc2FnZVBhcnR9YDtcbiAgICBpZiAoZXhwcmVzc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3Vic3RpdHV0aW9uc1twbGFjZWhvbGRlck5hbWVdID0gZXhwcmVzc2lvbnNbaSAtIDFdO1xuICAgICAgc3Vic3RpdHV0aW9uTG9jYXRpb25zW3BsYWNlaG9sZGVyTmFtZV0gPSBleHByZXNzaW9uTG9jYXRpb25zW2kgLSAxXTtcbiAgICB9XG4gICAgcGxhY2Vob2xkZXJOYW1lcy5wdXNoKHBsYWNlaG9sZGVyTmFtZSk7XG4gICAgaWYgKGFzc29jaWF0ZWRNZXNzYWdlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXNzb2NpYXRlZE1lc3NhZ2VJZHNbcGxhY2Vob2xkZXJOYW1lXSA9IGFzc29jaWF0ZWRNZXNzYWdlSWQ7XG4gICAgfVxuICAgIGNsZWFuZWRNZXNzYWdlUGFydHMucHVzaChtZXNzYWdlUGFydCk7XG4gIH1cbiAgY29uc3QgbWVzc2FnZUlkID0gbWV0YWRhdGEuY3VzdG9tSWQgfHwgY29tcHV0ZU1zZ0lkKG1lc3NhZ2VTdHJpbmcsIG1ldGFkYXRhLm1lYW5pbmcgfHwgJycpO1xuICBjb25zdCBsZWdhY3lJZHMgPSBtZXRhZGF0YS5sZWdhY3lJZHMgPyBtZXRhZGF0YS5sZWdhY3lJZHMuZmlsdGVyKChpZCkgPT4gaWQgIT09IG1lc3NhZ2VJZCkgOiBbXTtcbiAgcmV0dXJuIHtcbiAgICBpZDogbWVzc2FnZUlkLFxuICAgIGxlZ2FjeUlkcyxcbiAgICBzdWJzdGl0dXRpb25zLFxuICAgIHN1YnN0aXR1dGlvbkxvY2F0aW9ucyxcbiAgICB0ZXh0OiBtZXNzYWdlU3RyaW5nLFxuICAgIGN1c3RvbUlkOiBtZXRhZGF0YS5jdXN0b21JZCxcbiAgICBtZWFuaW5nOiBtZXRhZGF0YS5tZWFuaW5nIHx8ICcnLFxuICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICBtZXNzYWdlUGFydHM6IGNsZWFuZWRNZXNzYWdlUGFydHMsXG4gICAgbWVzc2FnZVBhcnRMb2NhdGlvbnMsXG4gICAgcGxhY2Vob2xkZXJOYW1lcyxcbiAgICBhc3NvY2lhdGVkTWVzc2FnZUlkcyxcbiAgICBsb2NhdGlvbixcbiAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gbWVzc2FnZSBwYXJ0IChgY29va2VkYCArIGByYXdgKSB0byBleHRyYWN0IHRoZSBtZXNzYWdlIG1ldGFkYXRhIGZyb20gdGhlIHRleHQuXG4gKlxuICogSWYgdGhlIG1lc3NhZ2UgcGFydCBoYXMgYSBtZXRhZGF0YSBibG9jayB0aGlzIGZ1bmN0aW9uIHdpbGwgZXh0cmFjdCB0aGUgYG1lYW5pbmdgLFxuICogYGRlc2NyaXB0aW9uYCwgYGN1c3RvbUlkYCBhbmQgYGxlZ2FjeUlkYCAoaWYgcHJvdmlkZWQpIGZyb20gdGhlIGJsb2NrLiBUaGVzZSBtZXRhZGF0YSBwcm9wZXJ0aWVzXG4gKiBhcmUgc2VyaWFsaXplZCBpbiB0aGUgc3RyaW5nIGRlbGltaXRlZCBieSBgfGAsIGBAQGAgYW5kIGDikJ9gIHJlc3BlY3RpdmVseS5cbiAqXG4gKiAoTm90ZSB0aGF0IGDikJ9gIGlzIHRoZSBgTEVHQUNZX0lEX0lORElDQVRPUmAgLSBzZWUgYGNvbnN0YW50cy50c2AuKVxuICpcbiAqIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiBgOm1lYW5pbmd8ZGVzY3JpcHRpb25AQGN1c3RvbS1pZDpgXG4gKiBgOm1lYW5pbmd8QEBjdXN0b20taWQ6YFxuICogYDptZWFuaW5nfGRlc2NyaXB0aW9uOmBcbiAqIGA6ZGVzY3JpcHRpb25AQGN1c3RvbS1pZDpgXG4gKiBgOm1lYW5pbmd8OmBcbiAqIGA6ZGVzY3JpcHRpb246YFxuICogYDpAQGN1c3RvbS1pZDpgXG4gKiBgOm1lYW5pbmd8ZGVzY3JpcHRpb25AQGN1c3RvbS1pZOKQn2xlZ2FjeS1pZC0x4pCfbGVnYWN5LWlkLTI6YFxuICogYGBgXG4gKlxuICogQHBhcmFtIGNvb2tlZCBUaGUgY29va2VkIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UgcGFydCB0byBwYXJzZS5cbiAqIEBwYXJhbSByYXcgVGhlIHJhdyB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlIHBhcnQgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBBIG9iamVjdCBjb250YWluaW5nIGFueSBtZXRhZGF0YSB0aGF0IHdhcyBwYXJzZWQgZnJvbSB0aGUgbWVzc2FnZSBwYXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YShjb29rZWQ6IHN0cmluZywgcmF3OiBzdHJpbmcpOiBNZXNzYWdlTWV0YWRhdGEge1xuICBjb25zdCB7dGV4dDogbWVzc2FnZVN0cmluZywgYmxvY2t9ID0gc3BsaXRCbG9jayhjb29rZWQsIHJhdyk7XG4gIGlmIChibG9jayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHt0ZXh0OiBtZXNzYWdlU3RyaW5nfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbbWVhbmluZ0Rlc2NBbmRJZCwgLi4ubGVnYWN5SWRzXSA9IGJsb2NrLnNwbGl0KExFR0FDWV9JRF9JTkRJQ0FUT1IpO1xuICAgIGNvbnN0IFttZWFuaW5nQW5kRGVzYywgY3VzdG9tSWRdID0gbWVhbmluZ0Rlc2NBbmRJZC5zcGxpdChJRF9TRVBBUkFUT1IsIDIpO1xuICAgIGxldCBbbWVhbmluZywgZGVzY3JpcHRpb25dOiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdID0gbWVhbmluZ0FuZERlc2Muc3BsaXQoTUVBTklOR19TRVBBUkFUT1IsIDIpO1xuICAgIGlmIChkZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9IG1lYW5pbmc7XG4gICAgICBtZWFuaW5nID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24gPT09ICcnKSB7XG4gICAgICBkZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHt0ZXh0OiBtZXNzYWdlU3RyaW5nLCBtZWFuaW5nLCBkZXNjcmlwdGlvbiwgY3VzdG9tSWQsIGxlZ2FjeUlkc307XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gbWVzc2FnZSBwYXJ0IChgY29va2VkYCArIGByYXdgKSB0byBleHRyYWN0IGFueSBwbGFjZWhvbGRlciBtZXRhZGF0YSBmcm9tIHRoZVxuICogdGV4dC5cbiAqXG4gKiBJZiB0aGUgbWVzc2FnZSBwYXJ0IGhhcyBhIG1ldGFkYXRhIGJsb2NrIHRoaXMgZnVuY3Rpb24gd2lsbCBleHRyYWN0IHRoZSBgcGxhY2Vob2xkZXJOYW1lYCBhbmRcbiAqIGBhc3NvY2lhdGVkTWVzc2FnZUlkYCAoaWYgcHJvdmlkZWQpIGZyb20gdGhlIGJsb2NrLlxuICpcbiAqIFRoZXNlIG1ldGFkYXRhIHByb3BlcnRpZXMgYXJlIHNlcmlhbGl6ZWQgaW4gdGhlIHN0cmluZyBkZWxpbWl0ZWQgYnkgYEBAYC5cbiAqXG4gKiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogYDpwbGFjZWhvbGRlci1uYW1lQEBhc3NvY2lhdGVkLWlkOmBcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjb29rZWQgVGhlIGNvb2tlZCB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlIHBhcnQgdG8gcGFyc2UuXG4gKiBAcGFyYW0gcmF3IFRoZSByYXcgdmVyc2lvbiBvZiB0aGUgbWVzc2FnZSBwYXJ0IHRvIHBhcnNlLlxuICogQHJldHVybnMgQSBvYmplY3QgY29udGFpbmluZyB0aGUgbWV0YWRhdGEgKGBwbGFjZWhvbGRlck5hbWVgIGFuZCBgYXNzb2NpYXRlZE1lc3NhZ2VJZGApIG9mIHRoZVxuICogICAgIHByZWNlZGluZyBwbGFjZWhvbGRlciwgYWxvbmcgd2l0aCB0aGUgc3RhdGljIHRleHQgdGhhdCBmb2xsb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQbGFjZWhvbGRlcihcbiAgY29va2VkOiBzdHJpbmcsXG4gIHJhdzogc3RyaW5nLFxuKToge21lc3NhZ2VQYXJ0OiBzdHJpbmc7IHBsYWNlaG9sZGVyTmFtZT86IHN0cmluZzsgYXNzb2NpYXRlZE1lc3NhZ2VJZD86IHN0cmluZ30ge1xuICBjb25zdCB7dGV4dDogbWVzc2FnZVBhcnQsIGJsb2NrfSA9IHNwbGl0QmxvY2soY29va2VkLCByYXcpO1xuICBpZiAoYmxvY2sgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7bWVzc2FnZVBhcnR9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtwbGFjZWhvbGRlck5hbWUsIGFzc29jaWF0ZWRNZXNzYWdlSWRdID0gYmxvY2suc3BsaXQoSURfU0VQQVJBVE9SKTtcbiAgICByZXR1cm4ge21lc3NhZ2VQYXJ0LCBwbGFjZWhvbGRlck5hbWUsIGFzc29jaWF0ZWRNZXNzYWdlSWR9O1xuICB9XG59XG5cbi8qKlxuICogU3BsaXQgYSBtZXNzYWdlIHBhcnQgKGBjb29rZWRgICsgYHJhd2ApIGludG8gYW4gb3B0aW9uYWwgZGVsaW1pdGVkIFwiYmxvY2tcIiBvZmYgdGhlIGZyb250IGFuZCB0aGVcbiAqIHJlc3Qgb2YgdGhlIHRleHQgb2YgdGhlIG1lc3NhZ2UgcGFydC5cbiAqXG4gKiBCbG9ja3MgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiBtZXNzYWdlIHBhcnRzLiBUaGV5IGFyZSBkZWxpbWl0ZWQgYnkgYSBjb2xvbiBgOmAgY2hhcmFjdGVyIGF0IHRoZVxuICogc3RhcnQgYW5kIGVuZCBvZiB0aGUgYmxvY2suXG4gKlxuICogSWYgdGhlIGJsb2NrIGlzIGluIHRoZSBmaXJzdCBtZXNzYWdlIHBhcnQgdGhlbiBpdCB3aWxsIGJlIG1ldGFkYXRhIGFib3V0IHRoZSB3aG9sZSBtZXNzYWdlOlxuICogbWVhbmluZywgZGVzY3JpcHRpb24sIGlkLiAgT3RoZXJ3aXNlIGl0IHdpbGwgYmUgbWV0YWRhdGEgYWJvdXQgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZ1xuICogc3Vic3RpdHV0aW9uOiBwbGFjZWhvbGRlciBuYW1lLlxuICpcbiAqIFNpbmNlIGJsb2NrcyBhcmUgb3B0aW9uYWwsIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNvbnRlbnQgb2YgYSBtZXNzYWdlIGJsb2NrIGFjdHVhbGx5IHN0YXJ0c1xuICogd2l0aCBhIGJsb2NrIG1hcmtlci4gSW4gdGhpcyBjYXNlIHRoZSBtYXJrZXIgbXVzdCBiZSBlc2NhcGVkIGBcXDpgLlxuICpcbiAqIEBwYXJhbSBjb29rZWQgVGhlIGNvb2tlZCB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlIHBhcnQgdG8gcGFyc2UuXG4gKiBAcGFyYW0gcmF3IFRoZSByYXcgdmVyc2lvbiBvZiB0aGUgbWVzc2FnZSBwYXJ0IHRvIHBhcnNlLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGB0ZXh0YCBvZiB0aGUgbWVzc2FnZSBwYXJ0IGFuZCB0aGUgdGV4dCBvZiB0aGUgYGJsb2NrYCwgaWYgaXRcbiAqIGV4aXN0cy5cbiAqIEB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGBibG9ja2AgaXMgdW50ZXJtaW5hdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEJsb2NrKGNvb2tlZDogc3RyaW5nLCByYXc6IHN0cmluZyk6IHt0ZXh0OiBzdHJpbmc7IGJsb2NrPzogc3RyaW5nfSB7XG4gIGlmIChyYXcuY2hhckF0KDApICE9PSBCTE9DS19NQVJLRVIpIHtcbiAgICByZXR1cm4ge3RleHQ6IGNvb2tlZH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZW5kT2ZCbG9jayA9IGZpbmRFbmRPZkJsb2NrKGNvb2tlZCwgcmF3KTtcbiAgICByZXR1cm4ge1xuICAgICAgYmxvY2s6IGNvb2tlZC5zdWJzdHJpbmcoMSwgZW5kT2ZCbG9jayksXG4gICAgICB0ZXh0OiBjb29rZWQuc3Vic3RyaW5nKGVuZE9mQmxvY2sgKyAxKSxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVQbGFjZWhvbGRlck5hbWUoaW5kZXg6IG51bWJlcikge1xuICByZXR1cm4gaW5kZXggPT09IDEgPyAnUEgnIDogYFBIXyR7aW5kZXggLSAxfWA7XG59XG5cbi8qKlxuICogRmluZCB0aGUgZW5kIG9mIGEgXCJtYXJrZWQgYmxvY2tcIiBpbmRpY2F0ZWQgYnkgdGhlIGZpcnN0IG5vbi1lc2NhcGVkIGNvbG9uLlxuICpcbiAqIEBwYXJhbSBjb29rZWQgVGhlIGNvb2tlZCBzdHJpbmcgKHdoZXJlIGVzY2FwZWQgY2hhcnMgaGF2ZSBiZWVuIHByb2Nlc3NlZClcbiAqIEBwYXJhbSByYXcgVGhlIHJhdyBzdHJpbmcgKHdoZXJlIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIHN0aWxsIGluIHBsYWNlKVxuICpcbiAqIEByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZW5kIG9mIGJsb2NrIG1hcmtlclxuICogQHRocm93cyBhbiBlcnJvciBpZiB0aGUgYmxvY2sgaXMgdW50ZXJtaW5hdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRW5kT2ZCbG9jayhjb29rZWQ6IHN0cmluZywgcmF3OiBzdHJpbmcpOiBudW1iZXIge1xuICBmb3IgKGxldCBjb29rZWRJbmRleCA9IDEsIHJhd0luZGV4ID0gMTsgY29va2VkSW5kZXggPCBjb29rZWQubGVuZ3RoOyBjb29rZWRJbmRleCsrLCByYXdJbmRleCsrKSB7XG4gICAgaWYgKHJhd1tyYXdJbmRleF0gPT09ICdcXFxcJykge1xuICAgICAgcmF3SW5kZXgrKztcbiAgICB9IGVsc2UgaWYgKGNvb2tlZFtjb29rZWRJbmRleF0gPT09IEJMT0NLX01BUktFUikge1xuICAgICAgcmV0dXJuIGNvb2tlZEluZGV4O1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVudGVybWluYXRlZCAkbG9jYWxpemUgbWV0YWRhdGEgYmxvY2sgaW4gXCIke3Jhd31cIi5gKTtcbn1cbiJdfQ==
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
import { BLOCK_MARKER } from './constants';
|
|
9
|
-
import { parseMessage } from './messages';
|
|
10
|
-
export class MissingTranslationError extends Error {
|
|
11
|
-
constructor(parsedMessage) {
|
|
12
|
-
super(`No translation found for ${describeMessage(parsedMessage)}.`);
|
|
13
|
-
this.parsedMessage = parsedMessage;
|
|
14
|
-
this.type = 'MissingTranslationError';
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
export function isMissingTranslationError(e) {
|
|
18
|
-
return e.type === 'MissingTranslationError';
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Translate the text of the `$localize` tagged-string (i.e. `messageParts` and
|
|
22
|
-
* `substitutions`) using the given `translations`.
|
|
23
|
-
*
|
|
24
|
-
* The tagged-string is parsed to extract its `messageId` which is used to find an appropriate
|
|
25
|
-
* `ParsedTranslation`. If this doesn't match and there are legacy ids then try matching a
|
|
26
|
-
* translation using those.
|
|
27
|
-
*
|
|
28
|
-
* If one is found then it is used to translate the message into a new set of `messageParts` and
|
|
29
|
-
* `substitutions`.
|
|
30
|
-
* The translation may reorder (or remove) substitutions as appropriate.
|
|
31
|
-
*
|
|
32
|
-
* If there is no translation with a matching message id then an error is thrown.
|
|
33
|
-
* If a translation contains a placeholder that is not found in the message being translated then an
|
|
34
|
-
* error is thrown.
|
|
35
|
-
*/
|
|
36
|
-
export function translate(translations, messageParts, substitutions) {
|
|
37
|
-
const message = parseMessage(messageParts, substitutions);
|
|
38
|
-
// Look up the translation using the messageId, and then the legacyId if available.
|
|
39
|
-
let translation = translations[message.id];
|
|
40
|
-
// If the messageId did not match a translation, try matching the legacy ids instead
|
|
41
|
-
if (message.legacyIds !== undefined) {
|
|
42
|
-
for (let i = 0; i < message.legacyIds.length && translation === undefined; i++) {
|
|
43
|
-
translation = translations[message.legacyIds[i]];
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
if (translation === undefined) {
|
|
47
|
-
throw new MissingTranslationError(message);
|
|
48
|
-
}
|
|
49
|
-
return [
|
|
50
|
-
translation.messageParts,
|
|
51
|
-
translation.placeholderNames.map((placeholder) => {
|
|
52
|
-
if (message.substitutions.hasOwnProperty(placeholder)) {
|
|
53
|
-
return message.substitutions[placeholder];
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
throw new Error(`There is a placeholder name mismatch with the translation provided for the message ${describeMessage(message)}.\n` +
|
|
57
|
-
`The translation contains a placeholder with name ${placeholder}, which does not exist in the message.`);
|
|
58
|
-
}
|
|
59
|
-
}),
|
|
60
|
-
];
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Parse the `messageParts` and `placeholderNames` out of a target `message`.
|
|
64
|
-
*
|
|
65
|
-
* Used by `loadTranslations()` to convert target message strings into a structure that is more
|
|
66
|
-
* appropriate for doing translation.
|
|
67
|
-
*
|
|
68
|
-
* @param message the message to be parsed.
|
|
69
|
-
*/
|
|
70
|
-
export function parseTranslation(messageString) {
|
|
71
|
-
const parts = messageString.split(/{\$([^}]*)}/);
|
|
72
|
-
const messageParts = [parts[0]];
|
|
73
|
-
const placeholderNames = [];
|
|
74
|
-
for (let i = 1; i < parts.length - 1; i += 2) {
|
|
75
|
-
placeholderNames.push(parts[i]);
|
|
76
|
-
messageParts.push(`${parts[i + 1]}`);
|
|
77
|
-
}
|
|
78
|
-
const rawMessageParts = messageParts.map((part) => part.charAt(0) === BLOCK_MARKER ? '\\' + part : part);
|
|
79
|
-
return {
|
|
80
|
-
text: messageString,
|
|
81
|
-
messageParts: makeTemplateObject(messageParts, rawMessageParts),
|
|
82
|
-
placeholderNames,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Create a `ParsedTranslation` from a set of `messageParts` and `placeholderNames`.
|
|
87
|
-
*
|
|
88
|
-
* @param messageParts The message parts to appear in the ParsedTranslation.
|
|
89
|
-
* @param placeholderNames The names of the placeholders to intersperse between the `messageParts`.
|
|
90
|
-
*/
|
|
91
|
-
export function makeParsedTranslation(messageParts, placeholderNames = []) {
|
|
92
|
-
let messageString = messageParts[0];
|
|
93
|
-
for (let i = 0; i < placeholderNames.length; i++) {
|
|
94
|
-
messageString += `{$${placeholderNames[i]}}${messageParts[i + 1]}`;
|
|
95
|
-
}
|
|
96
|
-
return {
|
|
97
|
-
text: messageString,
|
|
98
|
-
messageParts: makeTemplateObject(messageParts, messageParts),
|
|
99
|
-
placeholderNames,
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Create the specialized array that is passed to tagged-string tag functions.
|
|
104
|
-
*
|
|
105
|
-
* @param cooked The message parts with their escape codes processed.
|
|
106
|
-
* @param raw The message parts with their escaped codes as-is.
|
|
107
|
-
*/
|
|
108
|
-
export function makeTemplateObject(cooked, raw) {
|
|
109
|
-
Object.defineProperty(cooked, 'raw', { value: raw });
|
|
110
|
-
return cooked;
|
|
111
|
-
}
|
|
112
|
-
function describeMessage(message) {
|
|
113
|
-
const meaningString = message.meaning && ` - "${message.meaning}"`;
|
|
114
|
-
const legacy = message.legacyIds && message.legacyIds.length > 0
|
|
115
|
-
? ` [${message.legacyIds.map((l) => `"${l}"`).join(', ')}]`
|
|
116
|
-
: '';
|
|
117
|
-
return `"${message.id}"${legacy} ("${message.text}"${meaningString})`;
|
|
118
|
-
}
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbG9jYWxpemUvc3JjL3V0aWxzL3NyYy90cmFuc2xhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQTRDLFlBQVksRUFBZ0IsTUFBTSxZQUFZLENBQUM7QUFlbEcsTUFBTSxPQUFPLHVCQUF3QixTQUFRLEtBQUs7SUFFaEQsWUFBcUIsYUFBNEI7UUFDL0MsS0FBSyxDQUFDLDRCQUE0QixlQUFlLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRGxELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBRGhDLFNBQUksR0FBRyx5QkFBeUIsQ0FBQztJQUdsRCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLFVBQVUseUJBQXlCLENBQUMsQ0FBTTtJQUM5QyxPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUsseUJBQXlCLENBQUM7QUFDOUMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQ3ZCLFlBQStDLEVBQy9DLFlBQWtDLEVBQ2xDLGFBQTZCO0lBRTdCLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDMUQsbUZBQW1GO0lBQ25GLElBQUksV0FBVyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0Msb0ZBQW9GO0lBQ3BGLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFB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QUFDLENBQUM7SUFDbkQsT0FBTyxNQUFhLENBQUM7QUFDdkIsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLE9BQXNCO0lBQzdDLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUM7SUFDbkUsTUFBTSxNQUFNLEdBQ1YsT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO1FBQzNELENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDVCxPQUFPLElBQUksT0FBTyxDQUFDLEVBQUUsSUFBSSxNQUFNLE1BQU0sT0FBTyxDQUFDLElBQUksSUFBSSxhQUFhLEdBQUcsQ0FBQztBQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQge0JMT0NLX01BUktFUn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtNZXNzYWdlSWQsIE1lc3NhZ2VNZXRhZGF0YSwgUGFyc2VkTWVzc2FnZSwgcGFyc2VNZXNzYWdlLCBUYXJnZXRNZXNzYWdlfSBmcm9tICcuL21lc3NhZ2VzJztcblxuLyoqXG4gKiBBIHRyYW5zbGF0aW9uIG1lc3NhZ2UgdGhhdCBoYXMgYmVlbiBwcm9jZXNzZWQgdG8gZXh0cmFjdCB0aGUgbWVzc2FnZSBwYXJ0cyBhbmQgcGxhY2Vob2xkZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZFRyYW5zbGF0aW9uIGV4dGVuZHMgTWVzc2FnZU1ldGFkYXRhIHtcbiAgbWVzc2FnZVBhcnRzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheTtcbiAgcGxhY2Vob2xkZXJOYW1lczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIGludGVybmFsIHN0cnVjdHVyZSB1c2VkIGJ5IHRoZSBydW50aW1lIGxvY2FsaXphdGlvbiB0byB0cmFuc2xhdGUgbWVzc2FnZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlZFRyYW5zbGF0aW9ucyA9IFJlY29yZDxNZXNzYWdlSWQsIFBhcnNlZFRyYW5zbGF0aW9uPjtcblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdUcmFuc2xhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGUgPSAnTWlzc2luZ1RyYW5zbGF0aW9uRXJyb3InO1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBwYXJzZWRNZXNzYWdlOiBQYXJzZWRNZXNzYWdlKSB7XG4gICAgc3VwZXIoYE5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciAke2Rlc2NyaWJlTWVzc2FnZShwYXJzZWRNZXNzYWdlKX0uYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWlzc2luZ1RyYW5zbGF0aW9uRXJyb3IoZTogYW55KTogZSBpcyBNaXNzaW5nVHJhbnNsYXRpb25FcnJvciB7XG4gIHJldHVybiBlLnR5cGUgPT09ICdNaXNzaW5nVHJhbnNsYXRpb25FcnJvcic7XG59XG5cbi8qKlxuICogVHJhbnNsYXRlIHRoZSB0ZXh0IG9mIHRoZSBgJGxvY2FsaXplYCB0YWdnZWQtc3RyaW5nIChpLmUuIGBtZXNzYWdlUGFydHNgIGFuZFxuICogYHN1YnN0aXR1dGlvbnNgKSB1c2luZyB0aGUgZ2l2ZW4gYHRyYW5zbGF0aW9uc2AuXG4gKlxuICogVGhlIHRhZ2dlZC1zdHJpbmcgaXMgcGFyc2VkIHRvIGV4dHJhY3QgaXRzIGBtZXNzYWdlSWRgIHdoaWNoIGlzIHVzZWQgdG8gZmluZCBhbiBhcHByb3ByaWF0ZVxuICogYFBhcnNlZFRyYW5zbGF0aW9uYC4gSWYgdGhpcyBkb2Vzbid0IG1hdGNoIGFuZCB0aGVyZSBhcmUgbGVnYWN5IGlkcyB0aGVuIHRyeSBtYXRjaGluZyBhXG4gKiB0cmFuc2xhdGlvbiB1c2luZyB0aG9zZS5cbiAqXG4gKiBJZiBvbmUgaXMgZm91bmQgdGhlbiBpdCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSBpbnRvIGEgbmV3IHNldCBvZiBgbWVzc2FnZVBhcnRzYCBhbmRcbiAqIGBzdWJzdGl0dXRpb25zYC5cbiAqIFRoZSB0cmFuc2xhdGlvbiBtYXkgcmVvcmRlciAob3IgcmVtb3ZlKSBzdWJzdGl0dXRpb25zIGFzIGFwcHJvcHJpYXRlLlxuICpcbiAqIElmIHRoZXJlIGlzIG5vIHRyYW5zbGF0aW9uIHdpdGggYSBtYXRjaGluZyBtZXNzYWdlIGlkIHRoZW4gYW4gZXJyb3IgaXMgdGhyb3duLlxuICogSWYgYSB0cmFuc2xhdGlvbiBjb250YWlucyBhIHBsYWNlaG9sZGVyIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlIGJlaW5nIHRyYW5zbGF0ZWQgdGhlbiBhblxuICogZXJyb3IgaXMgdGhyb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKFxuICB0cmFuc2xhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFRyYW5zbGF0aW9uPixcbiAgbWVzc2FnZVBhcnRzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgc3Vic3RpdHV0aW9uczogcmVhZG9ubHkgYW55W10sXG4pOiBbVGVtcGxhdGVTdHJpbmdzQXJyYXksIHJlYWRvbmx5IGFueVtdXSB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBwYXJzZU1lc3NhZ2UobWVzc2FnZVBhcnRzLCBzdWJzdGl0dXRpb25zKTtcbiAgLy8gTG9vayB1cCB0aGUgdHJhbnNsYXRpb24gdXNpbmcgdGhlIG1lc3NhZ2VJZCwgYW5kIHRoZW4gdGhlIGxlZ2FjeUlkIGlmIGF2YWlsYWJsZS5cbiAgbGV0IHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25zW21lc3NhZ2UuaWRdO1xuICAvLyBJZiB0aGUgbWVzc2FnZUlkIGRpZCBub3QgbWF0Y2ggYSB0cmFuc2xhdGlvbiwgdHJ5IG1hdGNoaW5nIHRoZSBsZWdhY3kgaWRzIGluc3RlYWRcbiAgaWYgKG1lc3NhZ2UubGVnYWN5SWRzICE9PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2UubGVnYWN5SWRzLmxlbmd0aCAmJiB0cmFuc2xhdGlvbiA9PT0gdW5kZWZpbmVkOyBpKyspIHtcbiAgICAgIHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25zW21lc3NhZ2UubGVnYWN5SWRzW2ldXTtcbiAgICB9XG4gIH1cbiAgaWYgKHRyYW5zbGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgTWlzc2luZ1RyYW5zbGF0aW9uRXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgcmV0dXJuIFtcbiAgICB0cmFuc2xhdGlvbi5tZXNzYWdlUGFydHMsXG4gICAgdHJhbnNsYXRpb24ucGxhY2Vob2xkZXJOYW1lcy5tYXAoKHBsYWNlaG9sZGVyKSA9PiB7XG4gICAgICBpZiAobWVzc2FnZS5zdWJzdGl0dXRpb25zLmhhc093blByb3BlcnR5KHBsYWNlaG9sZGVyKSkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZS5zdWJzdGl0dXRpb25zW3BsYWNlaG9sZGVyXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlcmUgaXMgYSBwbGFjZWhvbGRlciBuYW1lIG1pc21hdGNoIHdpdGggdGhlIHRyYW5zbGF0aW9uIHByb3ZpZGVkIGZvciB0aGUgbWVzc2FnZSAke2Rlc2NyaWJlTWVzc2FnZShcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgKX0uXFxuYCArXG4gICAgICAgICAgICBgVGhlIHRyYW5zbGF0aW9uIGNvbnRhaW5zIGEgcGxhY2Vob2xkZXIgd2l0aCBuYW1lICR7cGxhY2Vob2xkZXJ9LCB3aGljaCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWVzc2FnZS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pLFxuICBdO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBgbWVzc2FnZVBhcnRzYCBhbmQgYHBsYWNlaG9sZGVyTmFtZXNgIG91dCBvZiBhIHRhcmdldCBgbWVzc2FnZWAuXG4gKlxuICogVXNlZCBieSBgbG9hZFRyYW5zbGF0aW9ucygpYCB0byBjb252ZXJ0IHRhcmdldCBtZXNzYWdlIHN0cmluZ3MgaW50byBhIHN0cnVjdHVyZSB0aGF0IGlzIG1vcmVcbiAqIGFwcHJvcHJpYXRlIGZvciBkb2luZyB0cmFuc2xhdGlvbi5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBwYXJzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRyYW5zbGF0aW9uKG1lc3NhZ2VTdHJpbmc6IFRhcmdldE1lc3NhZ2UpOiBQYXJzZWRUcmFuc2xhdGlvbiB7XG4gIGNvbnN0IHBhcnRzID0gbWVzc2FnZVN0cmluZy5zcGxpdCgve1xcJChbXn1dKil9Lyk7XG4gIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IFtwYXJ0c1swXV07XG4gIGNvbnN0IHBsYWNlaG9sZGVyTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgcGxhY2Vob2xkZXJOYW1lcy5wdXNoKHBhcnRzW2ldKTtcbiAgICBtZXNzYWdlUGFydHMucHVzaChgJHtwYXJ0c1tpICsgMV19YCk7XG4gIH1cbiAgY29uc3QgcmF3TWVzc2FnZVBhcnRzID0gbWVzc2FnZVBhcnRzLm1hcCgocGFydCkgPT5cbiAgICBwYXJ0LmNoYXJBdCgwKSA9PT0gQkxPQ0tfTUFSS0VSID8gJ1xcXFwnICsgcGFydCA6IHBhcnQsXG4gICk7XG4gIHJldHVybiB7XG4gICAgdGV4dDogbWVzc2FnZVN0cmluZyxcbiAgICBtZXNzYWdlUGFydHM6IG1ha2VUZW1wbGF0ZU9iamVjdChtZXNzYWdlUGFydHMsIHJhd01lc3NhZ2VQYXJ0cyksXG4gICAgcGxhY2Vob2xkZXJOYW1lcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgUGFyc2VkVHJhbnNsYXRpb25gIGZyb20gYSBzZXQgb2YgYG1lc3NhZ2VQYXJ0c2AgYW5kIGBwbGFjZWhvbGRlck5hbWVzYC5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZVBhcnRzIFRoZSBtZXNzYWdlIHBhcnRzIHRvIGFwcGVhciBpbiB0aGUgUGFyc2VkVHJhbnNsYXRpb24uXG4gKiBAcGFyYW0gcGxhY2Vob2xkZXJOYW1lcyBUaGUgbmFtZXMgb2YgdGhlIHBsYWNlaG9sZGVycyB0byBpbnRlcnNwZXJzZSBiZXR3ZWVuIHRoZSBgbWVzc2FnZVBhcnRzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQYXJzZWRUcmFuc2xhdGlvbihcbiAgbWVzc2FnZVBhcnRzOiBzdHJpbmdbXSxcbiAgcGxhY2Vob2xkZXJOYW1lczogc3RyaW5nW10gPSBbXSxcbik6IFBhcnNlZFRyYW5zbGF0aW9uIHtcbiAgbGV0IG1lc3NhZ2VTdHJpbmcgPSBtZXNzYWdlUGFydHNbMF07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGxhY2Vob2xkZXJOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgIG1lc3NhZ2VTdHJpbmcgKz0gYHskJHtwbGFjZWhvbGRlck5hbWVzW2ldfX0ke21lc3NhZ2VQYXJ0c1tpICsgMV19YDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHRleHQ6IG1lc3NhZ2VTdHJpbmcsXG4gICAgbWVzc2FnZVBhcnRzOiBtYWtlVGVtcGxhdGVPYmplY3QobWVzc2FnZVBhcnRzLCBtZXNzYWdlUGFydHMpLFxuICAgIHBsYWNlaG9sZGVyTmFtZXMsXG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBzcGVjaWFsaXplZCBhcnJheSB0aGF0IGlzIHBhc3NlZCB0byB0YWdnZWQtc3RyaW5nIHRhZyBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIGNvb2tlZCBUaGUgbWVzc2FnZSBwYXJ0cyB3aXRoIHRoZWlyIGVzY2FwZSBjb2RlcyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0gcmF3IFRoZSBtZXNzYWdlIHBhcnRzIHdpdGggdGhlaXIgZXNjYXBlZCBjb2RlcyBhcy1pcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQ6IHN0cmluZ1tdLCByYXc6IHN0cmluZ1tdKTogVGVtcGxhdGVTdHJpbmdzQXJyYXkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCAncmF3Jywge3ZhbHVlOiByYXd9KTtcbiAgcmV0dXJuIGNvb2tlZCBhcyBhbnk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTWVzc2FnZShtZXNzYWdlOiBQYXJzZWRNZXNzYWdlKTogc3RyaW5nIHtcbiAgY29uc3QgbWVhbmluZ1N0cmluZyA9IG1lc3NhZ2UubWVhbmluZyAmJiBgIC0gXCIke21lc3NhZ2UubWVhbmluZ31cImA7XG4gIGNvbnN0IGxlZ2FjeSA9XG4gICAgbWVzc2FnZS5sZWdhY3lJZHMgJiYgbWVzc2FnZS5sZWdhY3lJZHMubGVuZ3RoID4gMFxuICAgICAgPyBgIFske21lc3NhZ2UubGVnYWN5SWRzLm1hcCgobCkgPT4gYFwiJHtsfVwiYCkuam9pbignLCAnKX1dYFxuICAgICAgOiAnJztcbiAgcmV0dXJuIGBcIiR7bWVzc2FnZS5pZH1cIiR7bGVnYWN5fSAoXCIke21lc3NhZ2UudGV4dH1cIiR7bWVhbmluZ1N0cmluZ30pYDtcbn1cbiJdfQ==
|
|
File without changes
|
|
File without changes
|