ts-case-convert 2.3.2 → 3.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.
package/README.md CHANGED
@@ -18,11 +18,13 @@
18
18
  </a>
19
19
  </p>
20
20
 
21
- ts-case-convert is a zero dependency implementation for converting object keys between camelCase, snake_case, PascalCase, and SCREAMING_SNAKE_CASE while preserving TypeScript type information, code completion, and type validation. See tests for detailed conversion tests.
21
+ ts-case-convert is a zero dependency implementation for converting object keys between camelCase, snake_case, PascalCase, and SCREAMING_SNAKE_CASE, accepting upper and lower kebab-case input, while preserving TypeScript type information, code completion, and type validation. See tests for detailed conversion tests.
22
22
 
23
23
  ## Usage
24
24
 
25
25
  ```typescript
26
+ import { objectToCamel, objectToSnake, objectToScreamingSnake } from 'ts-case-convert';
27
+
26
28
  const camel = objectToCamel({
27
29
  hello_world: 'helloWorld',
28
30
  a_number: 5,
@@ -38,7 +40,7 @@ const camel = objectToCamel({
38
40
 
39
41
  type CheckCamel = typeof camel.anArrayOfObjects[0]['aB']; // -> 'string'
40
42
  const ab: CheckCamel = camel.anArrayOfObjects[0]['aB']; // -> valid
41
- console.log(camel.anArrayOfObjects.aB); // -> 'ab'
43
+ console.log(camel.anArrayOfObjects[0].aB); // -> 'ab'
42
44
 
43
45
  const snake = objectToSnake({
44
46
  helloWorld: 'helloWorld',
@@ -54,8 +56,8 @@ const snake = objectToSnake({
54
56
  });
55
57
 
56
58
  type CheckSnake = typeof snake.an_array_of_objects[0]['a_b']; // -> 'string'
57
- const ab: CheckSnake = snake.an_array_of_objects[0]['a_b']; // -> valid
58
- console.log(snake.an_array_of_objects.a_b); // -> 'ab'
59
+ const snakeAB: CheckSnake = snake.an_array_of_objects[0]['a_b']; // -> valid
60
+ console.log(snake.an_array_of_objects[0].a_b); // -> 'ab'
59
61
 
60
62
  const screamingSnake = objectToScreamingSnake({
61
63
  helloWorld: 'helloWorld',
@@ -69,16 +71,92 @@ type CheckScreamingSnake = typeof screamingSnake.NESTED_OBJECT.API_VERSION; // -
69
71
  console.log(screamingSnake.S3_ID); // -> 'id'
70
72
  ```
71
73
 
74
+ ## Supported input cases
75
+
76
+ The string functions `toCamel`, `toPascal`, `toSnake`, and `toScreamingSnake` convert a single name. The corresponding `objectTo…` functions convert keys recursively through objects and arrays, preserving values such as `Date` and `Uint8Array`. Both entry points export all four modes and their matching TypeScript types.
77
+
78
+ The converters recognize the input style before applying the output rules:
79
+
80
+ | Input style | Example | Camel | Pascal | Snake | Screaming snake |
81
+ | --- | --- | --- | --- | --- | --- |
82
+ | camelCase | `apiVersion` | `apiVersion` | `ApiVersion` | `api_version` | `API_VERSION` |
83
+ | PascalCase | `ApiVersion` | `apiVersion` | `ApiVersion` | `api_version` | `API_VERSION` |
84
+ | snake_case | `api_version` | `apiVersion` | `ApiVersion` | `api_version` | `API_VERSION` |
85
+ | SCREAMING_SNAKE_CASE | `API_VERSION` | `apiVersion` | `ApiVersion` | `api_version` | `API_VERSION` |
86
+ | Lower kebab | `content-type` | `contentType` | `ContentType` | `content_type` | `CONTENT_TYPE` |
87
+ | Title kebab | `Content-Type` | `contentType` | `ContentType` | `content_type` | `CONTENT_TYPE` |
88
+ | Upper kebab | `CONTENT-TYPE` | `contentType` | `ContentType` | `content_type` | `CONTENT_TYPE` |
89
+
90
+ For input without underscores or hyphens, camel and Pascal conversion change only the first character. Internal capitals remain unchanged: `AbcDEF` becomes `abcDEF` in camel case, and `abcDEF` becomes `AbcDEF` in Pascal case. This also preserves `HTTPServer` as `hTTPServer` in camel case and `ABC` as `aBC`.
91
+
92
+ For camel/Pascal input, snake conversion inserts an underscore before each capital after the first. It does not group capital runs into acronyms: `abcDEF` becomes `abc_d_e_f`, and `HTTPServer` becomes `h_t_t_p_server`. Screaming snake uses the same boundaries and uppercases the result.
93
+
94
+ For separated input, underscores and hyphens separate words, and consecutive capitals stay together. `API_VERSION` becomes `apiVersion`, `ApiVersion`, `api_version`, or `API_VERSION`. Capitalization boundaries use ASCII letters; other characters remain within the words.
95
+
96
+ ```typescript
97
+ import { objectToCamel, toPascal, toSnake, type ToCamel } from 'ts-case-convert';
98
+
99
+ const output = objectToCamel({ API_VERSION: 2, 'Content-Type': 'text/plain' });
100
+ console.log(output.apiVersion); // 2; inferred as number
101
+ console.log(output.contentType); // 'text/plain'; inferred as string
102
+
103
+ type Name = ToCamel<'API_VERSION'>; // 'apiVersion'
104
+ console.log(toPascal('API_VERSION')); // 'ApiVersion'
105
+ console.log(toSnake('HTTPServer')); // 'h_t_t_p_server'
106
+ ```
107
+
108
+ Signed decimal string keys such as `'-1'` and `'-12.5'` stay unchanged. Numeric object keys such as `42` become string keys such as `'42'` in both the returned value and its type. Repeated, leading, and trailing separators are not valid case styles. They are accepted without validation, and empty words are ignored: `a__b` becomes `aB`, `AB`, `a_b`, or `A_B`; `trailing_` becomes `trailing`, `Trailing`, `trailing`, or `TRAILING`. Empty strings and strings containing only separators become empty strings. The runtime result and inferred type follow the same rules.
109
+
110
+ ## Awkward inputs
111
+
112
+ The converters follow spelling rules rather than guessing what an acronym means. Existing camel/Pascal capitals are preserved when changing between those two styles, and each capital starts a word when converting to snake case. These inputs can therefore give surprising results:
113
+
114
+ | Input | Camel | Pascal | Snake | Screaming snake |
115
+ | --- | --- | --- | --- | --- |
116
+ | `AbcDEF` | `abcDEF` | `AbcDEF` | `abc_d_e_f` | `ABC_D_E_F` |
117
+ | `HTTPServer` | `hTTPServer` | `HTTPServer` | `h_t_t_p_server` | `H_T_T_P_SERVER` |
118
+ | `ABC` | `aBC` | `ABC` | `a_b_c` | `A_B_C` |
119
+ | `API_VERSION` | `apiVersion` | `ApiVersion` | `api_version` | `API_VERSION` |
120
+ | `a__b` | `aB` | `AB` | `a_b` | `A_B` |
121
+ | `trailing_` | `trailing` | `Trailing` | `trailing` | `TRAILING` |
122
+ | `a1` | `a1` | `A1` | `a_1` | `A_1` |
123
+ | `A1` | `a1` | `A1` | `a1` | `A1` |
124
+
125
+ The last two rows use default number splitting, which depends on the input letter case. The `no-split-numbers` entry point produces `a1` and `A1` for both rows in snake and screaming snake output. Repeated or trailing separators are invalid case styles, but their types and runtime values still agree. Use one consistent input style when predictable word boundaries matter.
126
+
127
+ ## Migrating to 3.0.0
128
+
129
+ Version 3 changes both returned keys and literal types. Update property access, serialized payloads, and integrations that rely on version 2 spellings:
130
+
131
+ | Conversion | Input | Version 2 runtime | Version 3 runtime and type |
132
+ | --- | --- | --- | --- |
133
+ | Camel | `API_VERSION` | `aPI_VERSION` | `apiVersion` |
134
+ | Pascal | `API_VERSION` | `API_VERSION` | `ApiVersion` |
135
+ | Snake | `API_VERSION` | `a_p_i__v_e_r_s_i_o_n` | `api_version` |
136
+ | Camel | `Content-Type` | `content-Type` | `contentType` |
137
+ | Snake | `content-type` | `content-type` | `content_type` |
138
+ | Camel | `a__b` | `a_B` | `aB` |
139
+ | Camel | `trailing_` | `trailing_` | `trailing` |
140
+
141
+ Separated uppercase words are normalized (`API_VERSION` becomes `apiVersion`, `ApiVersion`, `api_version`, or `API_VERSION`). Existing camel/Pascal names retain their previous conversion rules, including an underscore before each capital for snake output; standalone `ABC` becomes `aBC` in camel case and stays `ABC` in Pascal case. Every word boundary is converted; the old ten-replacement limit is removed. These changes apply to string functions, recursive object conversion, and `ts-case-convert/no-split-numbers`.
142
+
143
+ Distinct input keys can normalize to the same output key. For example, `a_b`, `a__b`, and `a-b` all become `aB` in camel case. Object conversion keeps the value of the last key visited by `Object.entries`; choose inputs without such collisions when every value must be retained.
144
+
72
145
  ## No Number Splitting
73
146
 
74
- The default snake case conversion splits lowercase letters from following numbers:
147
+ The default snake and screaming snake conversions split a lowercase letter from a following digit run, unless that run is followed by a capital and then a lowercase letter:
75
148
 
76
149
  ```typescript
77
150
  import { toSnake } from 'ts-case-convert';
78
151
 
79
152
  console.log(toSnake('myItem1')); // -> 'my_item_1'
153
+ console.log(toSnake('s3Id')); // -> 's3_id'
154
+ console.log(toSnake('http23Status')); // -> 'http23_status'
155
+ console.log(toSnake('A1')); // -> 'a1' (the input letter is uppercase)
80
156
  ```
81
157
 
158
+ Camel and Pascal conversion never split digit runs. Explicit word separators still apply in every mode.
159
+
82
160
  Use the `no-split-numbers` import path when numbers should stay attached to the preceding word. It exports the same runtime function and type names as the default entry point.
83
161
 
84
162
  ```typescript
@@ -116,7 +194,7 @@ pnpm run test
116
194
 
117
195
  ## Documentation
118
196
 
119
- See [tests](./test/caseConvert.test.ts), [bug regression tests](./test/caseConvert.bugs.test.ts), and [no-split-numbers tests](./test/no-split-numbers.test.ts).
197
+ See [tests](./test/caseConvert.test.ts), [bug regression tests](./test/caseConvert.bugs.test.ts), [no-split-numbers tests](./test/no-split-numbers.test.ts), [input case tests](./test/case-forms.test.ts), [kebab input tests](./test/kebab-case.test.ts), and [recursive conversion tests](./test/recursive-cases.test.ts).
120
198
 
121
199
  ## 📝 License
122
200
 
@@ -10,15 +10,15 @@ export declare function objectToScreamingSnake<T extends object>(obj: T): Object
10
10
  export declare function objectToScreamingSnakeNoSplitNumbers<T extends object>(obj: T): ObjectToScreamingSnake<T, false>;
11
11
  export declare function toPascal<T extends string>(term: T): ToPascal<T>;
12
12
  export declare function objectToPascal<T extends object>(obj: T): ObjectToPascal<T>;
13
- export type ToCamel<S extends string | number | symbol> = S extends string ? S extends NumericKey ? S : S extends `${infer Head}_${infer Tail}` ? `${ToCamel<Uncapitalize<Head>>}${Capitalize<ToCamel<Tail>>}` : S extends `${infer Head}-${infer Tail}` ? `${ToCamel<Uncapitalize<Head>>}${Capitalize<ToCamel<Tail>>}` : Uncapitalize<S> : never;
13
+ export type ToCamel<S extends string | number | symbol> = ConvertKey<S, 'camel', false>;
14
14
  export type ObjectToCamel<T extends object | undefined | null> = T extends undefined ? undefined : T extends null ? null : T extends Array<infer ArrayType> ? Array<ConvertArrayItem<ArrayType, 'camel'>> : T extends Uint8Array ? Uint8Array : T extends Date ? Date : {
15
15
  [K in keyof T as ToCamel<K>]: ConvertObjectValue<T[K], 'camel'>;
16
16
  };
17
- export type ToPascal<S extends string | number | symbol> = S extends string ? S extends NumericKey ? S : S extends `${infer Head}_${infer Tail}` ? `${Capitalize<ToCamel<Head>>}${Capitalize<ToCamel<Tail>>}` : S extends `${infer Head}-${infer Tail}` ? `${Capitalize<ToCamel<Head>>}${Capitalize<ToCamel<Tail>>}` : Capitalize<S> : never;
17
+ export type ToPascal<S extends string | number | symbol> = ConvertKey<S, 'pascal', false>;
18
18
  export type ObjectToPascal<T extends object | undefined | null> = T extends undefined ? undefined : T extends null ? null : T extends Array<infer ArrayType> ? Array<ConvertArrayItem<ArrayType, 'pascal'>> : T extends Uint8Array ? Uint8Array : T extends Date ? Date : {
19
19
  [K in keyof T as ToPascal<K>]: ConvertObjectValue<T[K], 'pascal'>;
20
20
  };
21
- export type ToSnake<S extends string | number | symbol, SplitNumbers extends boolean = true> = S extends string ? string extends S ? string : S extends NumericKey ? S : SnakeScan<S, '', 'start', SplitNumbers> : never;
21
+ export type ToSnake<S extends string | number | symbol, SplitNumbers extends boolean = true> = ConvertKey<S, 'snake', SplitNumbers>;
22
22
  export type ObjectToSnake<T extends object | undefined | null, SplitNumbers extends boolean = true> = T extends undefined ? undefined : T extends null ? null : T extends Array<infer ArrayType> ? Array<ConvertArrayItem<ArrayType, 'snake', SplitNumbers>> : T extends Uint8Array ? Uint8Array : T extends Date ? Date : {
23
23
  [K in keyof T as ToSnake<K, SplitNumbers>]: ConvertObjectValue<T[K], 'snake', SplitNumbers>;
24
24
  };
@@ -27,15 +27,15 @@ export type ObjectToScreamingSnake<T extends object | undefined | null, SplitNum
27
27
  [K in keyof T as ToScreamingSnake<K, SplitNumbers>]: ConvertObjectValue<T[K], 'screamingSnake', SplitNumbers>;
28
28
  };
29
29
  type CaseMode = 'camel' | 'pascal' | 'snake' | 'screamingSnake';
30
- type NumericKey = `${number}`;
31
- type SnakeScan<S extends string, Acc extends string, Previous extends CharacterKind, SplitNumbers extends boolean> = S extends `${infer Head}${infer Tail}` ? Head extends Numbers ? TakeNumberRun<S> extends [
32
- infer NumberRun extends string,
33
- infer AfterNumber extends string
34
- ] ? SnakeScan<AfterNumber, `${Acc}${NumberSeparator<Previous, AfterNumber, SplitNumbers>}${NumberRun}`, 'number', SplitNumbers> : never : Head extends CapitalLetters ? SnakeScan<Tail, `${Acc}${WordSeparator<Acc>}${Lowercase<Head>}`, 'upper', SplitNumbers> : Head extends LowercaseLetters ? SnakeScan<Tail, `${Acc}${Head}`, 'lower', SplitNumbers> : SnakeScan<Tail, `${Acc}${Head}`, 'other', SplitNumbers> : Acc;
30
+ type ConvertKey<S extends string | number | symbol, Mode extends CaseMode, SplitNumbers extends boolean> = S extends number ? ConvertKey<`${S}`, Mode, SplitNumbers> : S extends string ? string extends S ? string : IsNumericKey<S> extends true ? S : S extends `${string}${'_' | '-'}${string}` ? ConvertKeyScan<S, Mode, SplitNumbers> : Mode extends 'camel' ? Uncapitalize<S> : Mode extends 'pascal' ? Capitalize<S> : ConvertKeyScan<S, Mode, SplitNumbers, true> : never;
31
+ type IsNumericKey<S extends string> = S extends `-${infer Unsigned}` ? IsDecimal<Unsigned> : IsDecimal<S>;
32
+ type IsDecimal<S extends string> = S extends `${infer Whole}.${infer Fraction}` ? IsDigits<Whole> extends true ? IsDigits<Fraction> : false : IsDigits<S>;
33
+ type IsDigits<S extends string> = S extends '' ? false : TakeNumberRun<S> extends [string, ''] ? true : false;
34
+ type AppendWord<Acc extends string, Word extends string, Mode extends CaseMode> = Word extends '' ? Acc : Mode extends 'snake' ? Acc extends '' ? Lowercase<Word> : `${Acc}_${Lowercase<Word>}` : Mode extends 'pascal' ? `${Acc}${Capitalize<Lowercase<Word>>}` : Acc extends '' ? Lowercase<Word> : `${Acc}${Capitalize<Lowercase<Word>>}`;
35
+ type ConvertKeyScan<S extends string, Mode extends CaseMode, SplitNumbers extends boolean, SeparateCapitals extends boolean = false, Acc extends string = '', Word extends string = '', Previous extends string = ''> = string extends S ? string : S extends `${infer Head}${infer Tail}` ? string extends Head ? string : Head extends '_' | '-' ? ConvertKeyScan<Tail, Mode, SplitNumbers, SeparateCapitals, AppendWord<Acc, Word, Mode>> : Head extends Numbers ? TakeNumberRun<S> extends [infer Digits extends string, infer After extends string] ? SplitNumber<Previous, After, SplitNumbers> extends true ? ConvertKeyScan<After, Mode, SplitNumbers, SeparateCapitals, AppendWord<Acc, Word, Mode>, Digits, '0'> : ConvertKeyScan<After, Mode, SplitNumbers, SeparateCapitals, Acc, `${Word}${Digits}`, '0'> : never : Head extends CapitalLetters ? StartsWord<Previous, Tail, SeparateCapitals> extends true ? ConvertKeyScan<Tail, Mode, SplitNumbers, SeparateCapitals, AppendWord<Acc, Word, Mode>, Head, Head> : ConvertKeyScan<Tail, Mode, SplitNumbers, SeparateCapitals, Acc, `${Word}${Head}`, Head> : Head extends LowercaseLetters ? ConvertKeyScan<Tail, Mode, SplitNumbers, SeparateCapitals, Acc, `${Word}${Head}`, Head> : Extract<CapitalLetters | LowercaseLetters | Numbers | '_' | '-', Head> extends never ? ConvertKeyScan<Tail, Mode, SplitNumbers, SeparateCapitals, Acc, `${Word}${Head}`, Head> : string : S extends '' ? AppendWord<Acc, Word, Mode> : string;
36
+ type StartsWord<Previous extends string, Tail extends string, SeparateCapitals extends boolean> = SeparateCapitals extends true ? true : Previous extends LowercaseLetters | Numbers ? true : Previous extends CapitalLetters ? Tail extends `${LowercaseLetters}${string}` ? true : false : false;
35
37
  type TakeNumberRun<S extends string, Acc extends string = ''> = S extends `${infer Head}${infer Tail}` ? Head extends Numbers ? TakeNumberRun<Tail, `${Acc}${Head}`> : [Acc, S] : [Acc, ''];
36
- type NumberSeparator<Previous extends CharacterKind, AfterNumber extends string, SplitNumbers extends boolean> = SplitNumbers extends false ? '' : Previous extends 'lower' ? AfterNumber extends `${CapitalLetters}${LowercaseLetters}${string}` ? '' : '_' : '';
37
- type WordSeparator<Acc extends string> = Acc extends '' ? '' : Acc extends `${string}_` ? '' : '_';
38
- type CharacterKind = 'start' | 'lower' | 'upper' | 'number' | 'other';
38
+ type SplitNumber<Previous extends string, AfterNumber extends string, SplitNumbers extends boolean> = SplitNumbers extends false ? false : Previous extends LowercaseLetters ? AfterNumber extends `${CapitalLetters}${LowercaseLetters}${string}` ? false : true : false;
39
39
  type Convert<T extends object | undefined | null, Mode extends CaseMode, SplitNumbers extends boolean> = Mode extends 'camel' ? ObjectToCamel<T> : Mode extends 'pascal' ? ObjectToPascal<T> : Mode extends 'snake' ? ObjectToSnake<T, SplitNumbers> : ObjectToScreamingSnake<T, SplitNumbers>;
40
40
  type ConvertArrayItem<T, Mode extends CaseMode, SplitNumbers extends boolean = true> = T extends object ? Convert<T, Mode, SplitNumbers> : T;
41
41
  type ConvertObjectValue<T, Mode extends CaseMode, SplitNumbers extends boolean = true> = T extends Array<infer ArrayType> ? Array<ConvertArrayItem<ArrayType, Mode, SplitNumbers>> : T extends object | undefined | null ? Convert<T, Mode, SplitNumbers> : T;
@@ -33,49 +33,89 @@ function convertObject(obj, keyConverter) {
33
33
  }
34
34
  return out;
35
35
  }
36
- function toCamel(term) {
36
+ // Keep these word boundaries in sync with ConvertKeyScan below.
37
+ function convertKey(term, mode, splitNumbers = false) {
38
+ var _a, _b, _c, _d;
37
39
  if (isNumericKey(term)) {
38
40
  return term;
39
41
  }
40
- return (term.length === 1
41
- ? term.toLowerCase()
42
- : term
43
- .replace(/^([A-Z])/, (m) => m[0].toLowerCase())
44
- .replace(/[_-]([a-z0-9])/g, (m) => m[1].toUpperCase()));
45
- }
46
- function objectToCamel(obj) {
47
- return convertObject(obj, toCamel);
48
- }
49
- function toSnakeWithSplitNumbers(term, splitNumbers) {
50
- var _a;
51
- if (isNumericKey(term)) {
52
- return term;
42
+ const hasSeparators = /[_-]/.test(term);
43
+ // Existing camel/Pascal names retain every letter after the first.
44
+ if ((mode === 'camel' || mode === 'pascal') && !hasSeparators) {
45
+ const first = term.charAt(0);
46
+ return (mode === 'camel' ? first.toLowerCase() : first.toUpperCase()) + term.slice(1);
53
47
  }
54
- let result = term;
55
- let circuitBreaker = 0;
56
- if (splitNumbers) {
57
- while ((((_a = /([a-z])([0-9]+)(?![0-9]*[A-Z][a-z])/.exec(result)) === null || _a === void 0 ? void 0 : _a.length) || 0) >
58
- 2 &&
59
- circuitBreaker < 10) {
60
- result = result.replace(/([a-z])([0-9]+)(?![0-9]*[A-Z][a-z])/, (_all, head, numbers) => `${head.toLowerCase()}_${numbers.toLowerCase()}`);
61
- circuitBreaker += 1;
48
+ let result = '';
49
+ let wordStart = 0;
50
+ const appendWord = (end) => {
51
+ if (end === wordStart) {
52
+ return;
53
+ }
54
+ const word = term.slice(wordStart, end).toLowerCase();
55
+ if (mode === 'snake') {
56
+ result += `${result ? '_' : ''}${word}`;
57
+ }
58
+ else {
59
+ result += mode === 'pascal' || result !== ''
60
+ ? word[0].toUpperCase() + word.slice(1)
61
+ : word;
62
+ }
63
+ };
64
+ for (let index = 0; index < term.length; index += 1) {
65
+ const current = term[index];
66
+ const previous = (_a = term[index - 1]) !== null && _a !== void 0 ? _a : '';
67
+ if (current === '_' || current === '-') {
68
+ appendWord(index);
69
+ wordStart = index + 1;
70
+ }
71
+ else if (splitNumbers && isDigit(current)) {
72
+ let afterNumber = index + 1;
73
+ while (afterNumber < term.length && isDigit(term[afterNumber])) {
74
+ afterNumber += 1;
75
+ }
76
+ if (isLowercase(previous) &&
77
+ !(isUppercase((_b = term[afterNumber]) !== null && _b !== void 0 ? _b : '') && isLowercase((_c = term[afterNumber + 1]) !== null && _c !== void 0 ? _c : ''))) {
78
+ appendWord(index);
79
+ wordStart = index;
80
+ }
81
+ index = afterNumber - 1;
82
+ }
83
+ else if (index > wordStart && isUppercase(current) &&
84
+ (!hasSeparators || isLowercase(previous) || isDigit(previous) ||
85
+ (isUppercase(previous) && isLowercase((_d = term[index + 1]) !== null && _d !== void 0 ? _d : '')))) {
86
+ appendWord(index);
87
+ wordStart = index;
62
88
  }
63
89
  }
64
- // Match only the character before a capital to avoid rescanning long prefixes.
65
- result = result.replace(/(.)(?=[A-Z])/g, (head) => circuitBreaker++ < 10 ? `${head}_` : head);
66
- return result.toLowerCase();
90
+ appendWord(term.length);
91
+ return result;
92
+ }
93
+ function isLowercase(character) {
94
+ return character >= 'a' && character <= 'z';
95
+ }
96
+ function isUppercase(character) {
97
+ return character >= 'A' && character <= 'Z';
98
+ }
99
+ function isDigit(character) {
100
+ return character >= '0' && character <= '9';
101
+ }
102
+ function toCamel(term) {
103
+ return convertKey(term, 'camel');
104
+ }
105
+ function objectToCamel(obj) {
106
+ return convertObject(obj, toCamel);
67
107
  }
68
108
  function toSnake(term) {
69
- return toSnakeWithSplitNumbers(term, true);
109
+ return convertKey(term, 'snake', true);
70
110
  }
71
111
  function toSnakeNoSplitNumbers(term) {
72
- return toSnakeWithSplitNumbers(term, false);
112
+ return convertKey(term, 'snake', false);
73
113
  }
74
114
  function objectToSnake(obj) {
75
- return convertObject(obj, (key) => toSnakeWithSplitNumbers(key, true));
115
+ return convertObject(obj, toSnake);
76
116
  }
77
117
  function objectToSnakeNoSplitNumbers(obj) {
78
- return convertObject(obj, (key) => toSnakeWithSplitNumbers(key, false));
118
+ return convertObject(obj, toSnakeNoSplitNumbers);
79
119
  }
80
120
  function toScreamingSnake(term) {
81
121
  return toSnake(term).toUpperCase();
@@ -90,10 +130,7 @@ function objectToScreamingSnakeNoSplitNumbers(obj) {
90
130
  return convertObject(obj, toScreamingSnakeNoSplitNumbers);
91
131
  }
92
132
  function toPascal(term) {
93
- if (isNumericKey(term)) {
94
- return term;
95
- }
96
- return toCamel(term).replace(/^([a-z])/, (m) => m[0].toUpperCase());
133
+ return convertKey(term, 'pascal');
97
134
  }
98
135
  function objectToPascal(obj) {
99
136
  return convertObject(obj, toPascal);
@@ -101,4 +138,4 @@ function objectToPascal(obj) {
101
138
  function isNumericKey(term) {
102
139
  return /^-?\d+(?:\.\d+)?$/.test(term);
103
140
  }
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZUNvbnZlcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2FzZUNvbnZlcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFnREEsMEJBWUM7QUFFRCxzQ0FFQztBQWtDRCwwQkFFQztBQUVELHNEQUlDO0FBRUQsc0NBRUM7QUFFRCxrRUFJQztBQUVELDRDQUlDO0FBRUQsd0VBSUM7QUFFRCx3REFJQztBQUVELG9GQUlDO0FBRUQsNEJBUUM7QUFFRCx3Q0FFQztBQTFKRCxTQUFTLGFBQWEsQ0FDcEIsR0FBVyxFQUNYLFlBQXFDO0lBRXJDLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxXQUFXLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDMUUsT0FBTyxHQUF5QixDQUFDO0lBQ25DLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFZLENBQUM7SUFDdEQsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUV6QyxhQUFhO1FBRWIsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQTJCLElBQWUsRUFBRSxFQUFFLENBQ25ELE9BQU8sSUFBSSxLQUFLLFFBQVE7Z0JBQ3hCLENBQUMsQ0FBQyxJQUFJLFlBQVksVUFBVSxDQUFDO2dCQUM3QixDQUFDLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQztnQkFDckIsQ0FBQyxDQUFDLGFBQWEsQ0FTWCxJQUFJLEVBQUUsWUFBWSxDQUFDO2dCQUN2QixDQUFDLENB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Y3Rpb24gY29udmVydE9iamVjdDxUSW5wdXQgZXh0ZW5kcyBvYmplY3QsIFRSZXN1bHQ+KFxuICBvYmo6IFRJbnB1dCxcbiAga2V5Q29udmVydGVyOiAoYXJnOiBzdHJpbmcpID0+IHN0cmluZyxcbik6IFRSZXN1bHQge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9iaiBhcyB1bmtub3duIGFzIFRSZXN1bHQ7XG4gIH1cblxuICBjb25zdCBvdXQgPSAoQXJyYXkuaXNBcnJheShvYmopID8gW10gOiB7fSkgYXMgVFJlc3VsdDtcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuXG4gICAgb3V0W2tleUNvbnZlcnRlcihrKV0gPSBBcnJheS5pc0FycmF5KHYpXG4gICAgICA/ICh2Lm1hcCg8QXJyYXlJdGVtIGV4dGVuZHMgb2JqZWN0PihpdGVtOiBBcnJheUl0ZW0pID0+XG4gICAgICAgICAgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgIShpdGVtIGluc3RhbmNlb2YgVWludDhBcnJheSkgJiZcbiAgICAgICAgICAhKGl0ZW0gaW5zdGFuY2VvZiBEYXRlKVxuICAgICAgICAgICAgPyBjb252ZXJ0T2JqZWN0PFxuICAgICAgICAgICAgICAgIEFycmF5SXRlbSxcbiAgICAgICAgICAgICAgICBUUmVzdWx0IGV4dGVuZHMgT2JqZWN0VG9DYW1lbDxUSW5wdXQ+XG4gICAgICAgICAgICAgICAgICA/IE9iamVjdFRvQ2FtZWw8QXJyYXlJdGVtPlxuICAgICAgICAgICAgICAgICAgOiBUUmVzdWx0IGV4dGVuZHMgT2JqZWN0VG9QYXNjYWw8VElucHV0PlxuICAgICAgICAgICAgICAgICAgPyBPYmplY3RUb1Bhc2NhbDxBcnJheUl0ZW0+XG4gICAgICAgICAgICAgICAgICA6IFRSZXN1bHQgZXh0ZW5kcyBPYmplY3RUb1NjcmVhbWluZ1NuYWtlPFRJbnB1dD5cbiAgICAgICAgICAgICAgICAgID8gT2JqZWN0VG9TY3JlYW1pbmdTbmFrZTxBcnJheUl0ZW0+XG4gICAgICAgICAgICAgICAgICA6IE9iamVjdFRvU25ha2U8QXJyYXlJdGVtPlxuICAgICAgICAgICAgICA+KGl0ZW0sIGtleUNvbnZlcnRlcilcbiAgICAgICAgICAgIDogaXRlbSxcbiAgICAgICAgKSBhcyB1bmtub3duW10pXG4gICAgICA6IHYgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IHYgaW5zdGFuY2VvZiBEYXRlXG4gICAgICA/IHZcbiAgICAgIDogdHlwZW9mIHYgPT09ICdvYmplY3QnXG4gICAgICA/IGNvbnZlcnRPYmplY3Q8XG4gICAgICAgICAgdHlwZW9mIHYsXG4gICAgICAgICAgVFJlc3VsdCBleHRlbmRzIE9iamVjdFRvQ2FtZWw8VElucHV0PlxuICAgICAgICAgICAgPyBPYmplY3RUb0NhbWVsPHR5cGVvZiB2PlxuICAgICAgICAgICAgOiBUUmVzdWx0IGV4dGVuZHMgT2JqZWN0VG9QYXNjYWw8VElucHV0PlxuICAgICAgICAgICAgPyBPYmplY3RUb1Bhc2NhbDx0eXBlb2Ygdj5cbiAgICAgICAgICAgIDogVFJlc3VsdCBleHRlbmRzIE9iamVjdFRvU2NyZWFtaW5nU25ha2U8VElucHV0PlxuICAgICAgICAgICAgPyBPYmplY3RUb1NjcmVhbWluZ1NuYWtlPHR5cGVvZiB2PlxuICAgICAgICAgICAgOiBPYmplY3RUb1NuYWtlPHR5cGVvZiB2PlxuICAgICAgICA+KHYsIGtleUNvbnZlcnRlcilcbiAgICAgIDogKHYgYXMgdW5rbm93bik7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQ2FtZWw8VCBleHRlbmRzIHN0cmluZz4odGVybTogVCk6IFRvQ2FtZWw8VD4ge1xuICBpZiAoaXNOdW1lcmljS2V5KHRlcm0pKSB7XG4gICAgcmV0dXJuIHRlcm0gYXMgVG9DYW1lbDxUPjtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgdGVybS5sZW5ndGggPT09IDFcbiAgICAgID8gdGVybS50b0xvd2VyQ2FzZSgpXG4gICAgICA6IHRlcm1cbiAgICAgICAgICAucmVwbGFjZSgvXihbQS1aXSkvLCAobSkgPT4gbVswXS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgIC5yZXBsYWNlKC9bXy1dKFthLXowLTldKS9nLCAobSkgPT4gbVsxXS50b1VwcGVyQ2FzZSgpKVxuICApIGFzIFRvQ2FtZWw8VD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUb0NhbWVsPFQgZXh0ZW5kcyBvYmplY3Q+KG9iajogVCk6IE9iamVjdFRvQ2FtZWw8VD4ge1xuICByZXR1cm4gY29udmVydE9iamVjdChvYmosIHRvQ2FtZWwpO1xufVxuXG5mdW5jdGlvbiB0b1NuYWtlV2l0aFNwbGl0TnVtYmVycyh0ZXJtOiBzdHJpbmcsIHNwbGl0TnVtYmVyczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChpc051bWVyaWNLZXkodGVybSkpIHtcbiAgICByZXR1cm4gdGVybTtcbiAgfVxuXG4gIGxldCByZXN1bHQ6IHN0cmluZyA9IHRlcm07XG4gIGxldCBjaXJjdWl0QnJlYWtlciA9IDA7XG5cbiAgaWYgKHNwbGl0TnVtYmVycykge1xuICAgIHdoaWxlIChcbiAgICAgICgvKFthLXpdKShbMC05XSspKD8hWzAtOV0qW0EtWl1bYS16XSkvLmV4ZWMocmVzdWx0KT8ubGVuZ3RoIHx8IDApID5cbiAgICAgICAgMiAmJlxuICAgICAgY2lyY3VpdEJyZWFrZXIgPCAxMFxuICAgICkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoXG4gICAgICAgIC8oW2Etel0pKFswLTldKykoPyFbMC05XSpbQS1aXVthLXpdKS8sXG4gICAgICAgIChfYWxsLCBoZWFkOiBzdHJpbmcsIG51bWJlcnM6IHN0cmluZykgPT5cbiAgICAgICAgICBgJHtoZWFkLnRvTG93ZXJDYXNlKCl9XyR7bnVtYmVycy50b0xvd2VyQ2FzZSgpfWAsXG4gICAgICApO1xuXG4gICAgICBjaXJjdWl0QnJlYWtlciArPSAxO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1hdGNoIG9ubHkgdGhlIGNoYXJhY3RlciBiZWZvcmUgYSBjYXBpdGFsIHRvIGF2b2lkIHJlc2Nhbm5pbmcgbG9uZyBwcmVmaXhlcy5cbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLyguKSg/PVtBLVpdKS9nLCAoaGVhZDogc3RyaW5nKSA9PlxuICAgIGNpcmN1aXRCcmVha2VyKysgPCAxMCA/IGAke2hlYWR9X2AgOiBoZWFkLFxuICApO1xuXG4gIHJldHVybiByZXN1bHQudG9Mb3dlckNhc2UoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU25ha2U8VCBleHRlbmRzIHN0cmluZz4odGVybTogVCk6IFRvU25ha2U8VD4ge1xuICByZXR1cm4gdG9TbmFrZVdpdGhTcGxpdE51bWJlcnModGVybSwgdHJ1ZSkgYXMgVG9TbmFrZTxUPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU25ha2VOb1NwbGl0TnVtYmVyczxUIGV4dGVuZHMgc3RyaW5nPihcbiAgdGVybTogVCxcbik6IFRvU25ha2U8VCwgZmFsc2U+IHtcbiAgcmV0dXJuIHRvU25ha2VXaXRoU3BsaXROdW1iZXJzKHRlcm0sIGZhbHNlKSBhcyBUb1NuYWtlPFQsIGZhbHNlPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdFRvU25ha2U8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKTogT2JqZWN0VG9TbmFrZTxUPiB7XG4gIHJldHVybiBjb252ZXJ0T2JqZWN0KG9iaiwgKGtleSkgPT4gdG9TbmFrZVdpdGhTcGxpdE51bWJlcnMoa2V5LCB0cnVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUb1NuYWtlTm9TcGxpdE51bWJlcnM8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbik6IE9iamVjdFRvU25ha2U8VCwgZmFsc2U+IHtcbiAgcmV0dXJuIGNvbnZlcnRPYmplY3Qob2JqLCAoa2V5KSA9PiB0b1NuYWtlV2l0aFNwbGl0TnVtYmVycyhrZXksIGZhbHNlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NjcmVhbWluZ1NuYWtlPFQgZXh0ZW5kcyBzdHJpbmc+KFxuICB0ZXJtOiBULFxuKTogVG9TY3JlYW1pbmdTbmFrZTxUPiB7XG4gIHJldHVybiB0b1NuYWtlKHRlcm0pLnRvVXBwZXJDYXNlKCkgYXMgVG9TY3JlYW1pbmdTbmFrZTxUPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU2NyZWFtaW5nU25ha2VOb1NwbGl0TnVtYmVyczxUIGV4dGVuZHMgc3RyaW5nPihcbiAgdGVybTogVCxcbik6IFRvU2NyZWFtaW5nU25ha2U8VCwgZmFsc2U+IHtcbiAgcmV0dXJuIHRvU25ha2VOb1NwbGl0TnVtYmVycyh0ZXJtKS50b1VwcGVyQ2FzZSgpIGFzIFRvU2NyZWFtaW5nU25ha2U8VCwgZmFsc2U+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0VG9TY3JlYW1pbmdTbmFrZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgb2JqOiBULFxuKTogT2JqZWN0VG9TY3JlYW1pbmdTbmFrZTxUPiB7XG4gIHJldHVybiBjb252ZXJ0T2JqZWN0KG9iaiwgdG9TY3JlYW1pbmdTbmFrZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUb1NjcmVhbWluZ1NuYWtlTm9TcGxpdE51bWJlcnM8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbik6IE9iamVjdFRvU2NyZWFtaW5nU25ha2U8VCwgZmFsc2U+IHtcbiAgcmV0dXJuIGNvbnZlcnRPYmplY3Qob2JqLCB0b1NjcmVhbWluZ1NuYWtlTm9TcGxpdE51bWJlcnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9QYXNjYWw8VCBleHRlbmRzIHN0cmluZz4odGVybTogVCk6IFRvUGFzY2FsPFQ+IHtcbiAgaWYgKGlzTnVtZXJpY0tleSh0ZXJtKSkge1xuICAgIHJldHVybiB0ZXJtIGFzIFRvUGFzY2FsPFQ+O1xuICB9XG5cbiAgcmV0dXJuIHRvQ2FtZWwodGVybSkucmVwbGFjZSgvXihbYS16XSkvLCAobSkgPT5cbiAgICBtWzBdLnRvVXBwZXJDYXNlKCksXG4gICkgYXMgVG9QYXNjYWw8VD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUb1Bhc2NhbDxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQpOiBPYmplY3RUb1Bhc2NhbDxUPiB7XG4gIHJldHVybiBjb252ZXJ0T2JqZWN0KG9iaiwgdG9QYXNjYWwpO1xufVxuXG5leHBvcnQgdHlwZSBUb0NhbWVsPFMgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+ID0gUyBleHRlbmRzIHN0cmluZ1xuICA/IFMgZXh0ZW5kcyBOdW1lcmljS2V5XG4gICAgPyBTXG4gICAgOiBTIGV4dGVuZHMgYCR7aW5mZXIgSGVhZH1fJHtpbmZlciBUYWlsfWBcbiAgICA/IGAke1RvQ2FtZWw8VW5jYXBpdGFsaXplPEhlYWQ+Pn0ke0NhcGl0YWxpemU8VG9DYW1lbDxUYWlsPj59YFxuICAgIDogUyBleHRlbmRzIGAke2luZmVyIEhlYWR9LSR7aW5mZXIgVGFpbH1gXG4gICAgPyBgJHtUb0NhbWVsPFVuY2FwaXRhbGl6ZTxIZWFkPj59JHtDYXBpdGFsaXplPFRvQ2FtZWw8VGFpbD4+fWBcbiAgICA6IFVuY2FwaXRhbGl6ZTxTPlxuICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBPYmplY3RUb0NhbWVsPFQgZXh0ZW5kcyBvYmplY3QgfCB1bmRlZmluZWQgfCBudWxsPiA9XG4gIFQgZXh0ZW5kcyB1bmRlZmluZWRcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogVCBleHRlbmRzIG51bGxcbiAgICA/IG51bGxcbiAgICA6IFQgZXh0ZW5kcyBBcnJheTxpbmZlciBBcnJheVR5cGU+XG4gICAgPyBBcnJheTxDb252ZXJ0QXJyYXlJdGVtPEFycmF5VHlwZSwgJ2NhbWVsJz4+XG4gICAgOiBUIGV4dGVuZHMgVWludDhBcnJheVxuICAgID8gVWludDhBcnJheVxuICAgIDogVCBleHRlbmRzIERhdGVcbiAgICA/IERhdGVcbiAgICA6IHtcbiAgICAgICAgW0sgaW4ga2V5b2YgVCBhcyBUb0NhbWVsPEs+XTogQ29udmVydE9iamVjdFZhbHVlPFRbS10sICdjYW1lbCc+O1xuICAgICAgfTtcblxuZXhwb3J0IHR5cGUgVG9QYXNjYWw8UyBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4gPSBTIGV4dGVuZHMgc3RyaW5nXG4gID8gUyBleHRlbmRzIE51bWVyaWNLZXlcbiAgICA/IFNcbiAgICA6IFMgZXh0ZW5kcyBgJHtpbmZlciBIZWFkfV8ke2luZmVyIFRhaWx9YFxuICAgID8gYCR7Q2FwaXRhbGl6ZTxUb0NhbWVsPEhlYWQ+Pn0ke0NhcGl0YWxpemU8VG9DYW1lbDxUYWlsPj59YFxuICAgIDogUyBleHRlbmRzIGAke2luZmVyIEhlYWR9LSR7aW5mZXIgVGFpbH1gXG4gICAgPyBgJHtDYXBpdGFsaXplPFRvQ2FtZWw8SGVhZD4+fSR7Q2FwaXRhbGl6ZTxUb0NhbWVsPFRhaWw+Pn1gXG4gICAgOiBDYXBpdGFsaXplPFM+XG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIE9iamVjdFRvUGFzY2FsPFQgZXh0ZW5kcyBvYmplY3QgfCB1bmRlZmluZWQgfCBudWxsPiA9XG4gIFQgZXh0ZW5kcyB1bmRlZmluZWRcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogVCBleHRlbmRzIG51bGxcbiAgICA/IG51bGxcbiAgICA6IFQgZXh0ZW5kcyBBcnJheTxpbmZlciBBcnJheVR5cGU+XG4gICAgPyBBcnJheTxDb252ZXJ0QXJyYXlJdGVtPEFycmF5VHlwZSwgJ3Bhc2NhbCc+PlxuICAgIDogVCBleHRlbmRzIFVpbnQ4QXJyYXlcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IFQgZXh0ZW5kcyBEYXRlXG4gICAgPyBEYXRlXG4gICAgOiB7XG4gICAgICAgIFtLIGluIGtleW9mIFQgYXMgVG9QYXNjYWw8Sz5dOiBDb252ZXJ0T2JqZWN0VmFsdWU8VFtLXSwgJ3Bhc2NhbCc+O1xuICAgICAgfTtcblxuZXhwb3J0IHR5cGUgVG9TbmFrZTxcbiAgUyBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCxcbiAgU3BsaXROdW1iZXJzIGV4dGVuZHMgYm9vbGVhbiA9IHRydWUsXG4+ID0gUyBleHRlbmRzIHN0cmluZ1xuICA/IHN0cmluZyBleHRlbmRzIFNcbiAgICA/IHN0cmluZ1xuICAgIDogUyBleHRlbmRzIE51bWVyaWNLZXlcbiAgICA/IFNcbiAgICA6IFNuYWtlU2NhbjxTLCAnJywgJ3N0YXJ0JywgU3BsaXROdW1iZXJzPlxuICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBPYmplY3RUb1NuYWtlPFxuICBUIGV4dGVuZHMgb2JqZWN0IHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgU3BsaXROdW1iZXJzIGV4dGVuZHMgYm9vbGVhbiA9IHRydWUsXG4+ID1cbiAgVCBleHRlbmRzIHVuZGVmaW5lZFxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBUIGV4dGVuZHMgbnVsbFxuICAgID8gbnVsbFxuICAgIDogVCBleHRlbmRzIEFycmF5PGluZmVyIEFycmF5VHlwZT5cbiAgICA/IEFycmF5PENvbnZlcnRBcnJheUl0ZW08QXJyYXlUeXBlLCAnc25ha2UnLCBTcGxpdE51bWJlcnM+PlxuICAgIDogVCBleHRlbmRzIFVpbnQ4QXJyYXlcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IFQgZXh0ZW5kcyBEYXRlXG4gICAgPyBEYXRlXG4gICAgOiB7XG4gICAgICAgIFtLIGluIGtleW9mIFQgYXMgVG9TbmFrZTxLLCBTcGxpdE51bWJlcnM+XTogQ29udmVydE9iamVjdFZhbHVlPFxuICAgICAgICAgIFRbS10sXG4gICAgICAgICAgJ3NuYWtlJyxcbiAgICAgICAgICBTcGxpdE51bWJlcnNcbiAgICAgICAgPjtcbiAgICAgIH07XG5cbmV4cG9ydCB0eXBlIFRvU2NyZWFtaW5nU25ha2U8XG4gIFMgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsXG4gIFNwbGl0TnVtYmVycyBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuPiA9IFVwcGVyY2FzZTxUb1NuYWtlPFMsIFNwbGl0TnVtYmVycz4+O1xuXG5leHBvcnQgdHlwZSBPYmplY3RUb1NjcmVhbWluZ1NuYWtlPFxuICBUIGV4dGVuZHMgb2JqZWN0IHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgU3BsaXROdW1iZXJzIGV4dGVuZHMgYm9vbGVhbiA9IHRydWUsXG4+ID1cbiAgVCBleHRlbmRzIHVuZGVmaW5lZFxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBUIGV4dGVuZHMgbnVsbFxuICAgID8gbnVsbFxuICAgIDogVCBleHRlbmRzIEFycmF5PGluZmVyIEFycmF5VHlwZT5cbiAgICA/IEFycmF5PENvbnZlcnRBcnJheUl0ZW08QXJyYXlUeXBlLCAnc2NyZWFtaW5nU25ha2UnLCBTcGxpdE51bWJlcnM+PlxuICAgIDogVCBleHRlbmRzIFVpbnQ4QXJyYXlcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IFQgZXh0ZW5kcyBEYXRlXG4gICAgPyBEYXRlXG4gICAgOiB7XG4gICAgICAgIFtLIGluIGtleW9mIFQgYXMgVG9TY3JlYW1pbmdTbmFrZTxLLCBTcGxpdE51bWJlcnM+XTogQ29udmVydE9iamVjdFZhbHVlPFxuICAgICAgICAgIFRbS10sXG4gICAgICAgICAgJ3NjcmVhbWluZ1NuYWtlJyxcbiAgICAgICAgICBTcGxpdE51bWJlcnNcbiAgICAgICAgPjtcbiAgICAgIH07XG5cbnR5cGUgQ2FzZU1vZGUgPSAnY2FtZWwnIHwgJ3Bhc2NhbCcgfCAnc25ha2UnIHwgJ3NjcmVhbWluZ1NuYWtlJztcblxudHlwZSBOdW1lcmljS2V5ID0gYCR7bnVtYmVyfWA7XG5cbnR5cGUgU25ha2VTY2FuPFxuICBTIGV4dGVuZHMgc3RyaW5nLFxuICBBY2MgZXh0ZW5kcyBzdHJpbmcsXG4gIFByZXZpb3VzIGV4dGVuZHMgQ2hhcmFjdGVyS2luZCxcbiAgU3BsaXROdW1iZXJzIGV4dGVuZHMgYm9vbGVhbixcbj4gPSBTIGV4dGVuZHMgYCR7aW5mZXIgSGVhZH0ke2luZmVyIFRhaWx9YFxuICA/IEhlYWQgZXh0ZW5kcyBOdW1iZXJzXG4gICAgPyBUYWtlTnVtYmVyUnVuPFM+IGV4dGVuZHMgW1xuICAgICAgICBpbmZlciBOdW1iZXJSdW4gZXh0ZW5kcyBzdHJpbmcsXG4gICAgICAgIGluZmVyIEFmdGVyTnVtYmVyIGV4dGVuZHMgc3RyaW5nLFxuICAgICAgXVxuICAgICAgPyBTbmFrZVNjYW48XG4gICAgICAgICAgQWZ0ZXJOdW1iZXIsXG4gICAgICAgICAgYCR7QWNjfSR7TnVtYmVyU2VwYXJhdG9yPFxuICAgICAgICAgICAgUHJldmlvdXMsXG4gICAgICAgICAgICBBZnRlck51bWJlcixcbiAgICAgICAgICAgIFNwbGl0TnVtYmVyc1xuICAgICAgICAgID59JHtOdW1iZXJSdW59YCxcbiAgICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgICBTcGxpdE51bWJlcnNcbiAgICAgICAgPlxuICAgICAgOiBuZXZlclxuICAgIDogSGVhZCBleHRlbmRzIENhcGl0YWxMZXR0ZXJzXG4gICAgPyBTbmFrZVNjYW48XG4gICAgICAgIFRhaWwsXG4gICAgICAgIGAke0FjY30ke1dvcmRTZXBhcmF0b3I8QWNjPn0ke0xvd2VyY2FzZTxIZWFkPn1gLFxuICAgICAgICAndXBwZXInLFxuICAgICAgICBTcGxpdE51bWJlcnNcbiAgICAgID5cbiAgICA6IEhlYWQgZXh0ZW5kcyBMb3dlcmNhc2VMZXR0ZXJzXG4gICAgPyBTbmFrZVNjYW48VGFpbCwgYCR7QWNjfSR7SGVhZH1gLCAnbG93ZXInLCBTcGxpdE51bWJlcnM+XG4gICAgOiBTbmFrZVNjYW48VGFpbCwgYCR7QWNjfSR7SGVhZH1gLCAnb3RoZXInLCBTcGxpdE51bWJlcnM+XG4gIDogQWNjO1xuXG50eXBlIFRha2VOdW1iZXJSdW48XG4gIFMgZXh0ZW5kcyBzdHJpbmcsXG4gIEFjYyBleHRlbmRzIHN0cmluZyA9ICcnLFxuPiA9IFMgZXh0ZW5kcyBgJHtpbmZlciBIZWFkfSR7aW5mZXIgVGFpbH1gXG4gID8gSGVhZCBleHRlbmRzIE51bWJlcnNcbiAgICA/IFRha2VOdW1iZXJSdW48VGFpbCwgYCR7QWNjfSR7SGVhZH1gPlxuICAgIDogW0FjYywgU11cbiAgOiBbQWNjLCAnJ107XG5cbnR5cGUgTnVtYmVyU2VwYXJhdG9yPFxuICBQcmV2aW91cyBleHRlbmRzIENoYXJhY3RlcktpbmQsXG4gIEFmdGVyTnVtYmVyIGV4dGVuZHMgc3RyaW5nLFxuICBTcGxpdE51bWJlcnMgZXh0ZW5kcyBib29sZWFuLFxuPiA9IFNwbGl0TnVtYmVycyBleHRlbmRzIGZhbHNlXG4gID8gJydcbiAgOiBQcmV2aW91cyBleHRlbmRzICdsb3dlcidcbiAgPyBBZnRlck51bWJlciBleHRlbmRzIGAke0NhcGl0YWxMZXR0ZXJzfSR7TG93ZXJjYXNlTGV0dGVyc30ke3N0cmluZ31gXG4gICAgPyAnJ1xuICAgIDogJ18nXG4gIDogJyc7XG5cbnR5cGUgV29yZFNlcGFyYXRvcjxBY2MgZXh0ZW5kcyBzdHJpbmc+ID0gQWNjIGV4dGVuZHMgJydcbiAgPyAnJ1xuICA6IEFjYyBleHRlbmRzIGAke3N0cmluZ31fYFxuICA/ICcnXG4gIDogJ18nO1xuXG50eXBlIENoYXJhY3RlcktpbmQgPSAnc3RhcnQnIHwgJ2xvd2VyJyB8ICd1cHBlcicgfCAnbnVtYmVyJyB8ICdvdGhlcic7XG5cbnR5cGUgQ29udmVydDxcbiAgVCBleHRlbmRzIG9iamVjdCB8IHVuZGVmaW5lZCB8IG51bGwsXG4gIE1vZGUgZXh0ZW5kcyBDYXNlTW9kZSxcbiAgU3BsaXROdW1iZXJzIGV4dGVuZHMgYm9vbGVhbixcbj4gPVxuICBNb2RlIGV4dGVuZHMgJ2NhbWVsJ1xuICAgID8gT2JqZWN0VG9DYW1lbDxUPlxuICAgIDogTW9kZSBleHRlbmRzICdwYXNjYWwnXG4gICAgPyBPYmplY3RUb1Bhc2NhbDxUPlxuICAgIDogTW9kZSBleHRlbmRzICdzbmFrZSdcbiAgICA/IE9iamVjdFRvU25ha2U8VCwgU3BsaXROdW1iZXJzPlxuICAgIDogT2JqZWN0VG9TY3JlYW1pbmdTbmFrZTxULCBTcGxpdE51bWJlcnM+O1xuXG50eXBlIENvbnZlcnRBcnJheUl0ZW08XG4gIFQsXG4gIE1vZGUgZXh0ZW5kcyBDYXNlTW9kZSxcbiAgU3BsaXROdW1iZXJzIGV4dGVuZHMgYm9vbGVhbiA9IHRydWUsXG4+ID0gVCBleHRlbmRzIG9iamVjdFxuICA/IENvbnZlcnQ8VCwgTW9kZSwgU3BsaXROdW1iZXJzPlxuICA6IFQ7XG5cbnR5cGUgQ29udmVydE9iamVjdFZhbHVlPFxuICBULFxuICBNb2RlIGV4dGVuZHMgQ2FzZU1vZGUsXG4gIFNwbGl0TnVtYmVycyBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuPiA9IFQgZXh0ZW5kcyBBcnJheTxpbmZlciBBcnJheVR5cGU+XG4gID8gQXJyYXk8Q29udmVydEFycmF5SXRlbTxBcnJheVR5cGUsIE1vZGUsIFNwbGl0TnVtYmVycz4+XG4gIDogVCBleHRlbmRzIG9iamVjdCB8IHVuZGVmaW5lZCB8IG51bGxcbiAgPyBDb252ZXJ0PFQsIE1vZGUsIFNwbGl0TnVtYmVycz5cbiAgOiBUO1xuXG5mdW5jdGlvbiBpc051bWVyaWNLZXkodGVybTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXi0/XFxkKyg/OlxcLlxcZCspPyQvLnRlc3QodGVybSk7XG59XG5cbnR5cGUgQ2FwaXRhbExldHRlcnMgPVxuICB8ICdBJ1xuICB8ICdCJ1xuICB8ICdDJ1xuICB8ICdEJ1xuICB8ICdFJ1xuICB8ICdGJ1xuICB8ICdHJ1xuICB8ICdIJ1xuICB8ICdJJ1xuICB8ICdKJ1xuICB8ICdLJ1xuICB8ICdMJ1xuICB8ICdNJ1xuICB8ICdOJ1xuICB8ICdPJ1xuICB8ICdQJ1xuICB8ICdRJ1xuICB8ICdSJ1xuICB8ICdTJ1xuICB8ICdUJ1xuICB8ICdVJ1xuICB8ICdWJ1xuICB8ICdXJ1xuICB8ICdYJ1xuICB8ICdZJ1xuICB8ICdaJztcblxudHlwZSBMb3dlcmNhc2VMZXR0ZXJzID1cbiAgfCAnYSdcbiAgfCAnYidcbiAgfCAnYydcbiAgfCAnZCdcbiAgfCAnZSdcbiAgfCAnZidcbiAgfCAnZydcbiAgfCAnaCdcbiAgfCAnaSdcbiAgfCAnaidcbiAgfCAnaydcbiAgfCAnbCdcbiAgfCAnbSdcbiAgfCAnbidcbiAgfCAnbydcbiAgfCAncCdcbiAgfCAncSdcbiAgfCAncidcbiAgfCAncydcbiAgfCAndCdcbiAgfCAndSdcbiAgfCAndidcbiAgfCAndydcbiAgfCAneCdcbiAgfCAneSdcbiAgfCAneic7XG5cbnR5cGUgTnVtYmVycyA9ICcwJyB8ICcxJyB8ICcyJyB8ICczJyB8ICc0JyB8ICc1JyB8ICc2JyB8ICc3JyB8ICc4JyB8ICc5JztcbiJdfQ==
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZUNvbnZlcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2FzZUNvbnZlcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxSEEsMEJBRUM7QUFFRCxzQ0FFQztBQUVELDBCQUVDO0FBRUQsc0RBSUM7QUFFRCxzQ0FFQztBQUVELGtFQUlDO0FBRUQsNENBSUM7QUFFRCx3RUFJQztBQUVELHdEQUlDO0FBRUQsb0ZBSUM7QUFFRCw0QkFFQztBQUVELHdDQUVDO0FBL0tELFNBQVMsYUFBYSxDQUNwQixHQUFXLEVBQ1gsWUFBcUM7SUFFckMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFdBQVcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxRSxPQUFPLEdBQXlCLENBQUM7SUFDbkMsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQVksQ0FBQztJQUN0RCxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBRXpDLGFBQWE7UUFFYixHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDckMsQ0FBQyxDQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBMkIsSUFBZSxFQUFFLEVBQUUsQ0FDbkQsT0FBTyxJQUFJLEtBQUssUUFBUTtnQkFDeEIsQ0FBQyxDQUFDLElBQUksWUFBWSxVQUFVLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDO2dCQUNyQixDQUFDLENBQUMsYUFBYSxDQVNYLElBQUksRUFBRSxZQUFZLENBQUM7Z0JBQ3ZCLENBQUMsQ0FB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QUFDO0FBQzlDLENBQUM7QUFFRCxTQUFnQixvQ0FBb0MsQ0FDbEQsR0FBTTtJQUVOLE9BQU8sYUFBYSxDQUFDLEdBQUcsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxTQUFnQixRQUFRLENBQW1CLElBQU87SUFDaEQsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBZ0IsQ0FBQztBQUNuRCxDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFtQixHQUFNO0lBQ3JELE9BQU8sYUFBYSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBNk9ELFNBQVMsWUFBWSxDQUFDLElBQVk7SUFDaEMsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGNvbnZlcnRPYmplY3Q8VElucHV0IGV4dGVuZHMgb2JqZWN0LCBUUmVzdWx0PihcbiAgb2JqOiBUSW5wdXQsXG4gIGtleUNvbnZlcnRlcjogKGFyZzogc3RyaW5nKSA9PiBzdHJpbmcsXG4pOiBUUmVzdWx0IHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBvYmogYXMgdW5rbm93biBhcyBUUmVzdWx0O1xuICB9XG5cbiAgY29uc3Qgb3V0ID0gKEFycmF5LmlzQXJyYXkob2JqKSA/IFtdIDoge30pIGFzIFRSZXN1bHQ7XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcblxuICAgIC8vIEB0cy1pZ25vcmVcblxuICAgIG91dFtrZXlDb252ZXJ0ZXIoayldID0gQXJyYXkuaXNBcnJheSh2KVxuICAgICAgPyAodi5tYXAoPEFycmF5SXRlbSBleHRlbmRzIG9iamVjdD4oaXRlbTogQXJyYXlJdGVtKSA9PlxuICAgICAgICAgIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICEoaXRlbSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpICYmXG4gICAgICAgICAgIShpdGVtIGluc3RhbmNlb2YgRGF0ZSlcbiAgICAgICAgICAgID8gY29udmVydE9iamVjdDxcbiAgICAgICAgICAgICAgICBBcnJheUl0ZW0sXG4gICAgICAgICAgICAgICAgVFJlc3VsdCBleHRlbmRzIE9iamVjdFRvQ2FtZWw8VElucHV0PlxuICAgICAgICAgICAgICAgICAgPyBPYmplY3RUb0NhbWVsPEFycmF5SXRlbT5cbiAgICAgICAgICAgICAgICAgIDogVFJlc3VsdCBleHRlbmRzIE9iamVjdFRvUGFzY2FsPFRJbnB1dD5cbiAgICAgICAgICAgICAgICAgID8gT2JqZWN0VG9QYXNjYWw8QXJyYXlJdGVtPlxuICAgICAgICAgICAgICAgICAgOiBUUmVzdWx0IGV4dGVuZHMgT2JqZWN0VG9TY3JlYW1pbmdTbmFrZTxUSW5wdXQ+XG4gICAgICAgICAgICAgICAgICA/IE9iamVjdFRvU2NyZWFtaW5nU25ha2U8QXJyYXlJdGVtPlxuICAgICAgICAgICAgICAgICAgOiBPYmplY3RUb1NuYWtlPEFycmF5SXRlbT5cbiAgICAgICAgICAgICAgPihpdGVtLCBrZXlDb252ZXJ0ZXIpXG4gICAgICAgICAgICA6IGl0ZW0sXG4gICAgICAgICkgYXMgdW5rbm93bltdKVxuICAgICAgOiB2IGluc3RhbmNlb2YgVWludDhBcnJheSB8fCB2IGluc3RhbmNlb2YgRGF0ZVxuICAgICAgPyB2XG4gICAgICA6IHR5cGVvZiB2ID09PSAnb2JqZWN0J1xuICAgICAgPyBjb252ZXJ0T2JqZWN0PFxuICAgICAgICAgIHR5cGVvZiB2LFxuICAgICAgICAgIFRSZXN1bHQgZXh0ZW5kcyBPYmplY3RUb0NhbWVsPFRJbnB1dD5cbiAgICAgICAgICAgID8gT2JqZWN0VG9DYW1lbDx0eXBlb2Ygdj5cbiAgICAgICAgICAgIDogVFJlc3VsdCBleHRlbmRzIE9iamVjdFRvUGFzY2FsPFRJbnB1dD5cbiAgICAgICAgICAgID8gT2JqZWN0VG9QYXNjYWw8dHlwZW9mIHY+XG4gICAgICAgICAgICA6IFRSZXN1bHQgZXh0ZW5kcyBPYmplY3RUb1NjcmVhbWluZ1NuYWtlPFRJbnB1dD5cbiAgICAgICAgICAgID8gT2JqZWN0VG9TY3JlYW1pbmdTbmFrZTx0eXBlb2Ygdj5cbiAgICAgICAgICAgIDogT2JqZWN0VG9TbmFrZTx0eXBlb2Ygdj5cbiAgICAgICAgPih2LCBrZXlDb252ZXJ0ZXIpXG4gICAgICA6ICh2IGFzIHVua25vd24pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8vIEtlZXAgdGhlc2Ugd29yZCBib3VuZGFyaWVzIGluIHN5bmMgd2l0aCBDb252ZXJ0S2V5U2NhbiBiZWxvdy5cbmZ1bmN0aW9uIGNvbnZlcnRLZXkodGVybTogc3RyaW5nLCBtb2RlOiBDYXNlTW9kZSwgc3BsaXROdW1iZXJzID0gZmFsc2UpOiBzdHJpbmcge1xuICBpZiAoaXNOdW1lcmljS2V5KHRlcm0pKSB7XG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICBjb25zdCBoYXNTZXBhcmF0b3JzID0gL1tfLV0vLnRlc3QodGVybSk7XG4gIC8vIEV4aXN0aW5nIGNhbWVsL1Bhc2NhbCBuYW1lcyByZXRhaW4gZXZlcnkgbGV0dGVyIGFmdGVyIHRoZSBmaXJzdC5cbiAgaWYgKChtb2RlID09PSAnY2FtZWwnIHx8IG1vZGUgPT09ICdwYXNjYWwnKSAmJiAhaGFzU2VwYXJhdG9ycykge1xuICAgIGNvbnN0IGZpcnN0ID0gdGVybS5jaGFyQXQoMCk7XG4gICAgcmV0dXJuIChtb2RlID09PSAnY2FtZWwnID8gZmlyc3QudG9Mb3dlckNhc2UoKSA6IGZpcnN0LnRvVXBwZXJDYXNlKCkpICsgdGVybS5zbGljZSgxKTtcbiAgfVxuXG4gIGxldCByZXN1bHQgPSAnJztcbiAgbGV0IHdvcmRTdGFydCA9IDA7XG4gIGNvbnN0IGFwcGVuZFdvcmQgPSAoZW5kOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBpZiAoZW5kID09PSB3b3JkU3RhcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd29yZCA9IHRlcm0uc2xpY2Uod29yZFN0YXJ0LCBlbmQpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG1vZGUgPT09ICdzbmFrZScpIHtcbiAgICAgIHJlc3VsdCArPSBgJHtyZXN1bHQgPyAnXycgOiAnJ30ke3dvcmR9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ICs9IG1vZGUgPT09ICdwYXNjYWwnIHx8IHJlc3VsdCAhPT0gJydcbiAgICAgICAgPyB3b3JkWzBdLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpXG4gICAgICAgIDogd29yZDtcbiAgICB9XG4gIH07XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRlcm0ubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHRlcm1baW5kZXhdO1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGVybVtpbmRleCAtIDFdID8/ICcnO1xuICAgIGlmIChjdXJyZW50ID09PSAnXycgfHwgY3VycmVudCA9PT0gJy0nKSB7XG4gICAgICBhcHBlbmRXb3JkKGluZGV4KTtcbiAgICAgIHdvcmRTdGFydCA9IGluZGV4ICsgMTtcbiAgICB9IGVsc2UgaWYgKHNwbGl0TnVtYmVycyAmJiBpc0RpZ2l0KGN1cnJlbnQpKSB7XG4gICAgICBsZXQgYWZ0ZXJOdW1iZXIgPSBpbmRleCArIDE7XG4gICAgICB3aGlsZSAoYWZ0ZXJOdW1iZXIgPCB0ZXJtLmxlbmd0aCAmJiBpc0RpZ2l0KHRlcm1bYWZ0ZXJOdW1iZXJdKSkge1xuICAgICAgICBhZnRlck51bWJlciArPSAxO1xuICAgICAgfVxuICAgICAgaWYgKGlzTG93ZXJjYXNlKHByZXZpb3VzKSAmJlxuICAgICAgICAgICEoaXNVcHBlcmNhc2UodGVybVthZnRlck51bWJlcl0gPz8gJycpICYmIGlzTG93ZXJjYXNlKHRlcm1bYWZ0ZXJOdW1iZXIgKyAxXSA/PyAnJykpKSB7XG4gICAgICAgIGFwcGVuZFdvcmQoaW5kZXgpO1xuICAgICAgICB3b3JkU3RhcnQgPSBpbmRleDtcbiAgICAgIH1cbiAgICAgIGluZGV4ID0gYWZ0ZXJOdW1iZXIgLSAxO1xuICAgIH0gZWxzZSBpZiAoaW5kZXggPiB3b3JkU3RhcnQgJiYgaXNVcHBlcmNhc2UoY3VycmVudCkgJiZcbiAgICAgICAgKCFoYXNTZXBhcmF0b3JzIHx8IGlzTG93ZXJjYXNlKHByZXZpb3VzKSB8fCBpc0RpZ2l0KHByZXZpb3VzKSB8fFxuICAgICAgICAgIChpc1VwcGVyY2FzZShwcmV2aW91cykgJiYgaXNMb3dlcmNhc2UodGVybVtpbmRleCArIDFdID8/ICcnKSkpKSB7XG4gICAgICBhcHBlbmRXb3JkKGluZGV4KTtcbiAgICAgIHdvcmRTdGFydCA9IGluZGV4O1xuICAgIH1cbiAgfVxuICBhcHBlbmRXb3JkKHRlcm0ubGVuZ3RoKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNMb3dlcmNhc2UoY2hhcmFjdGVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoYXJhY3RlciA+PSAnYScgJiYgY2hhcmFjdGVyIDw9ICd6Jztcbn1cblxuZnVuY3Rpb24gaXNVcHBlcmNhc2UoY2hhcmFjdGVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoYXJhY3RlciA+PSAnQScgJiYgY2hhcmFjdGVyIDw9ICdaJztcbn1cblxuZnVuY3Rpb24gaXNEaWdpdChjaGFyYWN0ZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hhcmFjdGVyID49ICcwJyAmJiBjaGFyYWN0ZXIgPD0gJzknO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9DYW1lbDxUIGV4dGVuZHMgc3RyaW5nPih0ZXJtOiBUKTogVG9DYW1lbDxUPiB7XG4gIHJldHVybiBjb252ZXJ0S2V5KHRlcm0sICdjYW1lbCcpIGFzIFRvQ2FtZWw8VD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUb0NhbWVsPFQgZXh0ZW5kcyBvYmplY3Q+KG9iajogVCk6IE9iamVjdFRvQ2FtZWw8VD4ge1xuICByZXR1cm4gY29udmVydE9iamVjdChvYmosIHRvQ2FtZWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TbmFrZTxUIGV4dGVuZHMgc3RyaW5nPih0ZXJtOiBUKTogVG9TbmFrZTxUPiB7XG4gIHJldHVybiBjb252ZXJ0S2V5KHRlcm0sICdzbmFrZScsIHRydWUpIGFzIFRvU25ha2U8VD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NuYWtlTm9TcGxpdE51bWJlcnM8VCBleHRlbmRzIHN0cmluZz4oXG4gIHRlcm06IFQsXG4pOiBUb1NuYWtlPFQsIGZhbHNlPiB7XG4gIHJldHVybiBjb252ZXJ0S2V5KHRlcm0sICdzbmFrZScsIGZhbHNlKSBhcyBUb1NuYWtlPFQsIGZhbHNlPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdFRvU25ha2U8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKTogT2JqZWN0VG9TbmFrZTxUPiB7XG4gIHJldHVybiBjb252ZXJ0T2JqZWN0KG9iaiwgdG9TbmFrZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUb1NuYWtlTm9TcGxpdE51bWJlcnM8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbik6IE9iamVjdFRvU25ha2U8VCwgZmFsc2U+IHtcbiAgcmV0dXJuIGNvbnZlcnRPYmplY3Qob2JqLCB0b1NuYWtlTm9TcGxpdE51bWJlcnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TY3JlYW1pbmdTbmFrZTxUIGV4dGVuZHMgc3RyaW5nPihcbiAgdGVybTogVCxcbik6IFRvU2NyZWFtaW5nU25ha2U8VD4ge1xuICByZXR1cm4gdG9TbmFrZSh0ZXJtKS50b1VwcGVyQ2FzZSgpIGFzIFRvU2NyZWFtaW5nU25ha2U8VD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NjcmVhbWluZ1NuYWtlTm9TcGxpdE51bWJlcnM8VCBleHRlbmRzIHN0cmluZz4oXG4gIHRlcm06IFQsXG4pOiBUb1NjcmVhbWluZ1NuYWtlPFQsIGZhbHNlPiB7XG4gIHJldHVybiB0b1NuYWtlTm9TcGxpdE51bWJlcnModGVybSkudG9VcHBlckNhc2UoKSBhcyBUb1NjcmVhbWluZ1NuYWtlPFQsIGZhbHNlPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdFRvU2NyZWFtaW5nU25ha2U8VCBleHRlbmRzIG9iamVjdD4oXG4gIG9iajogVCxcbik6IE9iamVjdFRvU2NyZWFtaW5nU25ha2U8VD4ge1xuICByZXR1cm4gY29udmVydE9iamVjdChvYmosIHRvU2NyZWFtaW5nU25ha2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0VG9TY3JlYW1pbmdTbmFrZU5vU3BsaXROdW1iZXJzPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBvYmo6IFQsXG4pOiBPYmplY3RUb1NjcmVhbWluZ1NuYWtlPFQsIGZhbHNlPiB7XG4gIHJldHVybiBjb252ZXJ0T2JqZWN0KG9iaiwgdG9TY3JlYW1pbmdTbmFrZU5vU3BsaXROdW1iZXJzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUGFzY2FsPFQgZXh0ZW5kcyBzdHJpbmc+KHRlcm06IFQpOiBUb1Bhc2NhbDxUPiB7XG4gIHJldHVybiBjb252ZXJ0S2V5KHRlcm0sICdwYXNjYWwnKSBhcyBUb1Bhc2NhbDxUPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdFRvUGFzY2FsPFQgZXh0ZW5kcyBvYmplY3Q+KG9iajogVCk6IE9iamVjdFRvUGFzY2FsPFQ+IHtcbiAgcmV0dXJuIGNvbnZlcnRPYmplY3Qob2JqLCB0b1Bhc2NhbCk7XG59XG5cbmV4cG9ydCB0eXBlIFRvQ2FtZWw8UyBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4gPVxuICBDb252ZXJ0S2V5PFMsICdjYW1lbCcsIGZhbHNlPjtcblxuZXhwb3J0IHR5cGUgT2JqZWN0VG9DYW1lbDxUIGV4dGVuZHMgb2JqZWN0IHwgdW5kZWZpbmVkIHwgbnVsbD4gPVxuICBUIGV4dGVuZHMgdW5kZWZpbmVkXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IFQgZXh0ZW5kcyBudWxsXG4gICAgPyBudWxsXG4gICAgOiBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgQXJyYXlUeXBlPlxuICAgID8gQXJyYXk8Q29udmVydEFycmF5SXRlbTxBcnJheVR5cGUsICdjYW1lbCc+PlxuICAgIDogVCBleHRlbmRzIFVpbnQ4QXJyYXlcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IFQgZXh0ZW5kcyBEYXRlXG4gICAgPyBEYXRlXG4gICAgOiB7XG4gICAgICAgIFtLIGluIGtleW9mIFQgYXMgVG9DYW1lbDxLPl06IENvbnZlcnRPYmplY3RWYWx1ZTxUW0tdLCAnY2FtZWwnPjtcbiAgICAgIH07XG5cbmV4cG9ydCB0eXBlIFRvUGFzY2FsPFMgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+ID1cbiAgQ29udmVydEtleTxTLCAncGFzY2FsJywgZmFsc2U+O1xuXG5leHBvcnQgdHlwZSBPYmplY3RUb1Bhc2NhbDxUIGV4dGVuZHMgb2JqZWN0IHwgdW5kZWZpbmVkIHwgbnVsbD4gPVxuICBUIGV4dGVuZHMgdW5kZWZpbmVkXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IFQgZXh0ZW5kcyBudWxsXG4gICAgPyBudWxsXG4gICAgOiBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgQXJyYXlUeXBlPlxuICAgID8gQXJyYXk8Q29udmVydEFycmF5SXRlbTxBcnJheVR5cGUsICdwYXNjYWwnPj5cbiAgICA6IFQgZXh0ZW5kcyBVaW50OEFycmF5XG4gICAgPyBVaW50OEFycmF5XG4gICAgOiBUIGV4dGVuZHMgRGF0ZVxuICAgID8gRGF0ZVxuICAgIDoge1xuICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRvUGFzY2FsPEs+XTogQ29udmVydE9iamVjdFZhbHVlPFRbS10sICdwYXNjYWwnPjtcbiAgICAgIH07XG5cbmV4cG9ydCB0eXBlIFRvU25ha2U8XG4gIFMgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsXG4gIFNwbGl0TnVtYmVycyBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuPiA9IENvbnZlcnRLZXk8UywgJ3NuYWtlJywgU3BsaXROdW1iZXJzPjtcblxuZXhwb3J0IHR5cGUgT2JqZWN0VG9TbmFrZTxcbiAgVCBleHRlbmRzIG9iamVjdCB8IHVuZGVmaW5lZCB8IG51bGwsXG4gIFNwbGl0TnVtYmVycyBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuPiA9XG4gIFQgZXh0ZW5kcyB1bmRlZmluZWRcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogVCBleHRlbmRzIG51bGxcbiAgICA/IG51bGxcbiAgICA6IFQgZXh0ZW5kcyBBcnJheTxpbmZlciBBcnJheVR5cGU+XG4gICAgPyBBcnJheTxDb252ZXJ0QXJyYXlJdGVtPEFycmF5VHlwZSwgJ3NuYWtlJywgU3BsaXROdW1iZXJzPj5cbiAgICA6IFQgZXh0ZW5kcyBVaW50OEFycmF5XG4gICAgPyBVaW50OEFycmF5XG4gICAgOiBUIGV4dGVuZHMgRGF0ZVxuICAgID8gRGF0ZVxuICAgIDoge1xuICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRvU25ha2U8SywgU3BsaXROdW1iZXJzPl06IENvbnZlcnRPYmplY3RWYWx1ZTxcbiAgICAgICAgICBUW0tdLFxuICAgICAgICAgICdzbmFrZScsXG4gICAgICAgICAgU3BsaXROdW1iZXJzXG4gICAgICAgID47XG4gICAgICB9O1xuXG5leHBvcnQgdHlwZSBUb1NjcmVhbWluZ1NuYWtlPFxuICBTIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLFxuICBTcGxpdE51bWJlcnMgZXh0ZW5kcyBib29sZWFuID0gdHJ1ZSxcbj4gPSBVcHBlcmNhc2U8VG9TbmFrZTxTLCBTcGxpdE51bWJlcnM+PjtcblxuZXhwb3J0IHR5cGUgT2JqZWN0VG9TY3JlYW1pbmdTbmFrZTxcbiAgVCBleHRlbmRzIG9iamVjdCB8IHVuZGVmaW5lZCB8IG51bGwsXG4gIFNwbGl0TnVtYmVycyBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuPiA9XG4gIFQgZXh0ZW5kcyB1bmRlZmluZWRcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogVCBleHRlbmRzIG51bGxcbiAgICA/IG51bGxcbiAgICA6IFQgZXh0ZW5kcyBBcnJheTxpbmZlciBBcnJheVR5cGU+XG4gICAgPyBBcnJheTxDb252ZXJ0QXJyYXlJdGVtPEFycmF5VHlwZSwgJ3NjcmVhbWluZ1NuYWtlJywgU3BsaXROdW1iZXJzPj5cbiAgICA6IFQgZXh0ZW5kcyBVaW50OEFycmF5XG4gICAgPyBVaW50OEFycmF5XG4gICAgOiBUIGV4dGVuZHMgRGF0ZVxuICAgID8gRGF0ZVxuICAgIDoge1xuICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRvU2NyZWFtaW5nU25ha2U8SywgU3BsaXROdW1iZXJzPl06IENvbnZlcnRPYmplY3RWYWx1ZTxcbiAgICAgICAgICBUW0tdLFxuICAgICAgICAgICdzY3JlYW1pbmdTbmFrZScsXG4gICAgICAgICAgU3BsaXROdW1iZXJzXG4gICAgICAgID47XG4gICAgICB9O1xuXG50eXBlIENhc2VNb2RlID0gJ2NhbWVsJyB8ICdwYXNjYWwnIHwgJ3NuYWtlJyB8ICdzY3JlYW1pbmdTbmFrZSc7XG5cbnR5cGUgQ29udmVydEtleTxcbiAgUyBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCxcbiAgTW9kZSBleHRlbmRzIENhc2VNb2RlLFxuICBTcGxpdE51bWJlcnMgZXh0ZW5kcyBib29sZWFuLFxuPiA9IFMgZXh0ZW5kcyBudW1iZXJcbiAgPyBDb252ZXJ0S2V5PGAke1N9YCwgTW9kZSwgU3BsaXROdW1iZXJzPlxuICA6IFMgZXh0ZW5kcyBzdHJpbmdcbiAgPyBzdHJpbmcgZXh0ZW5kcyBTXG4gICAgPyBzdHJpbmdcbiAgICA6IElzTnVtZXJpY0tleTxTPiBleHRlbmRzIHRydWVcbiAgICA/IFNcbiAgICA6IFMgZXh0ZW5kcyBgJHtzdHJpbmd9JHsnXycgfCAnLSd9JHtzdHJpbmd9YFxuICAgID8gQ29udmVydEtleVNjYW48UywgTW9kZSwgU3BsaXROdW1iZXJzPlxuICAgIDogTW9kZSBleHRlbmRzICdjYW1lbCdcbiAgICA/IFVuY2FwaXRhbGl6ZTxTPlxuICAgIDogTW9kZSBleHRlbmRzICdwYXNjYWwnXG4gICAgPyBDYXBpdGFsaXplPFM+XG4gICAgOiBDb252ZXJ0S2V5U2NhbjxTLCBNb2RlLCBTcGxpdE51bWJlcnMsIHRydWU+XG4gIDogbmV2ZXI7XG5cbi8vIFNpZ25lZCBkZWNpbWFsIHN0cmluZ3MgdXNlIHRoZSBzYW1lIGdyYW1tYXIgYXMgaXNOdW1lcmljS2V5IGF0IHJ1bnRpbWUuXG50eXBlIElzTnVtZXJpY0tleTxTIGV4dGVuZHMgc3RyaW5nPiA9IFMgZXh0ZW5kcyBgLSR7aW5mZXIgVW5zaWduZWR9YFxuICA/IElzRGVjaW1hbDxVbnNpZ25lZD5cbiAgOiBJc0RlY2ltYWw8Uz47XG5cbnR5cGUgSXNEZWNpbWFsPFMgZXh0ZW5kcyBzdHJpbmc+ID0gUyBleHRlbmRzIGAke2luZmVyIFdob2xlfS4ke2luZmVyIEZyYWN0aW9ufWBcbiAgPyBJc0RpZ2l0czxXaG9sZT4gZXh0ZW5kcyB0cnVlXG4gICAgPyBJc0RpZ2l0czxGcmFjdGlvbj5cbiAgICA6IGZhbHNlXG4gIDogSXNEaWdpdHM8Uz47XG5cbnR5cGUgSXNEaWdpdHM8UyBleHRlbmRzIHN0cmluZz4gPSBTIGV4dGVuZHMgJydcbiAgPyBmYWxzZVxuICA6IFRha2VOdW1iZXJSdW48Uz4gZXh0ZW5kcyBbc3RyaW5nLCAnJ10gPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgQXBwZW5kV29yZDxcbiAgQWNjIGV4dGVuZHMgc3RyaW5nLFxuICBXb3JkIGV4dGVuZHMgc3RyaW5nLFxuICBNb2RlIGV4dGVuZHMgQ2FzZU1vZGUsXG4+ID0gV29yZCBleHRlbmRzICcnXG4gID8gQWNjXG4gIDogTW9kZSBleHRlbmRzICdzbmFrZSdcbiAgPyBBY2MgZXh0ZW5kcyAnJyA/IExvd2VyY2FzZTxXb3JkPiA6IGAke0FjY31fJHtMb3dlcmNhc2U8V29yZD59YFxuICA6IE1vZGUgZXh0ZW5kcyAncGFzY2FsJ1xuICA/IGAke0FjY30ke0NhcGl0YWxpemU8TG93ZXJjYXNlPFdvcmQ+Pn1gXG4gIDogQWNjIGV4dGVuZHMgJycgPyBMb3dlcmNhc2U8V29yZD4gOiBgJHtBY2N9JHtDYXBpdGFsaXplPExvd2VyY2FzZTxXb3JkPj59YDtcblxudHlwZSBDb252ZXJ0S2V5U2NhbjxcbiAgUyBleHRlbmRzIHN0cmluZyxcbiAgTW9kZSBleHRlbmRzIENhc2VNb2RlLFxuICBTcGxpdE51bWJlcnMgZXh0ZW5kcyBib29sZWFuLFxuICBTZXBhcmF0ZUNhcGl0YWxzIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuICBBY2MgZXh0ZW5kcyBzdHJpbmcgPSAnJyxcbiAgV29yZCBleHRlbmRzIHN0cmluZyA9ICcnLFxuICBQcmV2aW91cyBleHRlbmRzIHN0cmluZyA9ICcnLFxuPiA9IHN0cmluZyBleHRlbmRzIFNcbiAgPyBzdHJpbmdcbiAgOiBTIGV4dGVuZHMgYCR7aW5mZXIgSGVhZH0ke2luZmVyIFRhaWx9YFxuICA/IHN0cmluZyBleHRlbmRzIEhlYWRcbiAgICA/IHN0cmluZ1xuICAgIDogSGVhZCBleHRlbmRzICdfJyB8ICctJ1xuICAgID8gQ29udmVydEtleVNjYW48VGFpbCwgTW9kZSwgU3BsaXROdW1iZXJzLCBTZXBhcmF0ZUNhcGl0YWxzLCBBcHBlbmRXb3JkPEFjYywgV29yZCwgTW9kZT4+XG4gICAgOiBIZWFkIGV4dGVuZHMgTnVtYmVyc1xuICAgID8gVGFrZU51bWJlclJ1bjxTPiBleHRlbmRzIFtpbmZlciBEaWdpdHMgZXh0ZW5kcyBzdHJpbmcsIGluZmVyIEFmdGVyIGV4dGVuZHMgc3RyaW5nXVxuICAgICAgPyBTcGxpdE51bWJlcjxQcmV2aW91cywgQWZ0ZXIsIFNwbGl0TnVtYmVycz4gZXh0ZW5kcyB0cnVlXG4gICAgICAgID8gQ29udmVydEtleVNjYW48QWZ0ZXIsIE1vZGUsIFNwbGl0TnVtYmVycywgU2VwYXJhdGVDYXBpdGFscywgQXBwZW5kV29yZDxBY2MsIFdvcmQsIE1vZGU+LCBEaWdpdHMsICcwJz5cbiAgICAgICAgOiBDb252ZXJ0S2V5U2NhbjxBZnRlciwgTW9kZSwgU3BsaXROdW1iZXJzLCBTZXBhcmF0ZUNhcGl0YWxzLCBBY2MsIGAke1dvcmR9JHtEaWdpdHN9YCwgJzAnPlxuICAgICAgOiBuZXZlclxuICAgIDogSGVhZCBleHRlbmRzIENhcGl0YWxMZXR0ZXJzXG4gICAgPyBTdGFydHNXb3JkPFByZXZpb3VzLCBUYWlsLCBTZXBhcmF0ZUNhcGl0YWxzPiBleHRlbmRzIHRydWVcbiAgICAgID8gQ29udmVydEtleVNjYW48VGFpbCwgTW9kZSwgU3BsaXROdW1iZXJzLCBTZXBhcmF0ZUNhcGl0YWxzLCBBcHBlbmRXb3JkPEFjYywgV29yZCwgTW9kZT4sIEhlYWQsIEhlYWQ+XG4gICAgICA6IENvbnZlcnRLZXlTY2FuPFRhaWwsIE1vZGUsIFNwbGl0TnVtYmVycywgU2VwYXJhdGVDYXBpdGFscywgQWNjLCBgJHtXb3JkfSR7SGVhZH1gLCBIZWFkPlxuICAgIDogSGVhZCBleHRlbmRzIExvd2VyY2FzZUxldHRlcnNcbiAgICA/IENvbnZlcnRLZXlTY2FuPFRhaWwsIE1vZGUsIFNwbGl0TnVtYmVycywgU2VwYXJhdGVDYXBpdGFscywgQWNjLCBgJHtXb3JkfSR7SGVhZH1gLCBIZWFkPlxuICAgIDogRXh0cmFjdDxDYXBpdGFsTGV0dGVycyB8IExvd2VyY2FzZUxldHRlcnMgfCBOdW1iZXJzIHwgJ18nIHwgJy0nLCBIZWFkPiBleHRlbmRzIG5ldmVyXG4gICAgPyBDb252ZXJ0S2V5U2NhbjxUYWlsLCBNb2RlLCBTcGxpdE51bWJlcnMsIFNlcGFyYXRlQ2FwaXRhbHMsIEFjYywgYCR7V29yZH0ke0hlYWR9YCwgSGVhZD5cbiAgICA6IHN0cmluZ1xuICA6IFMgZXh0ZW5kcyAnJyA/IEFwcGVuZFdvcmQ8QWNjLCBXb3JkLCBNb2RlPiA6IHN0cmluZztcblxudHlwZSBTdGFydHNXb3JkPFxuICBQcmV2aW91cyBleHRlbmRzIHN0cmluZyxcbiAgVGFpbCBleHRlbmRzIHN0cmluZyxcbiAgU2VwYXJhdGVDYXBpdGFscyBleHRlbmRzIGJvb2xlYW4sXG4+ID0gU2VwYXJhdGVDYXBpdGFscyBleHRlbmRzIHRydWVcbiAgPyB0cnVlXG4gIDogUHJldmlvdXMgZXh0ZW5kcyBMb3dlcmNhc2VMZXR0ZXJzIHwgTnVtYmVyc1xuICAgID8gdHJ1ZVxuICAgIDogUHJldmlvdXMgZXh0ZW5kcyBDYXBpdGFsTGV0dGVyc1xuICAgID8gVGFpbCBleHRlbmRzIGAke0xvd2VyY2FzZUxldHRlcnN9JHtzdHJpbmd9YCA/IHRydWUgOiBmYWxzZVxuICAgIDogZmFsc2U7XG5cbnR5cGUgVGFrZU51bWJlclJ1bjxcbiAgUyBleHRlbmRzIHN0cmluZyxcbiAgQWNjIGV4dGVuZHMgc3RyaW5nID0gJycsXG4+ID0gUyBleHRlbmRzIGAke2luZmVyIEhlYWR9JHtpbmZlciBUYWlsfWBcbiAgPyBIZWFkIGV4dGVuZHMgTnVtYmVyc1xuICAgID8gVGFrZU51bWJlclJ1bjxUYWlsLCBgJHtBY2N9JHtIZWFkfWA+XG4gICAgOiBbQWNjLCBTXVxuICA6IFtBY2MsICcnXTtcblxudHlwZSBTcGxpdE51bWJlcjxcbiAgUHJldmlvdXMgZXh0ZW5kcyBzdHJpbmcsXG4gIEFmdGVyTnVtYmVyIGV4dGVuZHMgc3RyaW5nLFxuICBTcGxpdE51bWJlcnMgZXh0ZW5kcyBib29sZWFuLFxuPiA9IFNwbGl0TnVtYmVycyBleHRlbmRzIGZhbHNlXG4gID8gZmFsc2VcbiAgOiBQcmV2aW91cyBleHRlbmRzIExvd2VyY2FzZUxldHRlcnNcbiAgPyBBZnRlck51bWJlciBleHRlbmRzIGAke0NhcGl0YWxMZXR0ZXJzfSR7TG93ZXJjYXNlTGV0dGVyc30ke3N0cmluZ31gXG4gICAgPyBmYWxzZVxuICAgIDogdHJ1ZVxuICA6IGZhbHNlO1xuXG50eXBlIENvbnZlcnQ8XG4gIFQgZXh0ZW5kcyBvYmplY3QgfCB1bmRlZmluZWQgfCBudWxsLFxuICBNb2RlIGV4dGVuZHMgQ2FzZU1vZGUsXG4gIFNwbGl0TnVtYmVycyBleHRlbmRzIGJvb2xlYW4sXG4+ID1cbiAgTW9kZSBleHRlbmRzICdjYW1lbCdcbiAgICA/IE9iamVjdFRvQ2FtZWw8VD5cbiAgICA6IE1vZGUgZXh0ZW5kcyAncGFzY2FsJ1xuICAgID8gT2JqZWN0VG9QYXNjYWw8VD5cbiAgICA6IE1vZGUgZXh0ZW5kcyAnc25ha2UnXG4gICAgPyBPYmplY3RUb1NuYWtlPFQsIFNwbGl0TnVtYmVycz5cbiAgICA6IE9iamVjdFRvU2NyZWFtaW5nU25ha2U8VCwgU3BsaXROdW1iZXJzPjtcblxudHlwZSBDb252ZXJ0QXJyYXlJdGVtPFxuICBULFxuICBNb2RlIGV4dGVuZHMgQ2FzZU1vZGUsXG4gIFNwbGl0TnVtYmVycyBleHRlbmRzIGJvb2xlYW4gPSB0cnVlLFxuPiA9IFQgZXh0ZW5kcyBvYmplY3RcbiAgPyBDb252ZXJ0PFQsIE1vZGUsIFNwbGl0TnVtYmVycz5cbiAgOiBUO1xuXG50eXBlIENvbnZlcnRPYmplY3RWYWx1ZTxcbiAgVCxcbiAgTW9kZSBleHRlbmRzIENhc2VNb2RlLFxuICBTcGxpdE51bWJlcnMgZXh0ZW5kcyBib29sZWFuID0gdHJ1ZSxcbj4gPSBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgQXJyYXlUeXBlPlxuICA/IEFycmF5PENvbnZlcnRBcnJheUl0ZW08QXJyYXlUeXBlLCBNb2RlLCBTcGxpdE51bWJlcnM+PlxuICA6IFQgZXh0ZW5kcyBvYmplY3QgfCB1bmRlZmluZWQgfCBudWxsXG4gID8gQ29udmVydDxULCBNb2RlLCBTcGxpdE51bWJlcnM+XG4gIDogVDtcblxuZnVuY3Rpb24gaXNOdW1lcmljS2V5KHRlcm06IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL14tP1xcZCsoPzpcXC5cXGQrKT8kLy50ZXN0KHRlcm0pO1xufVxuXG50eXBlIENhcGl0YWxMZXR0ZXJzID1cbiAgfCAnQSdcbiAgfCAnQidcbiAgfCAnQydcbiAgfCAnRCdcbiAgfCAnRSdcbiAgfCAnRidcbiAgfCAnRydcbiAgfCAnSCdcbiAgfCAnSSdcbiAgfCAnSidcbiAgfCAnSydcbiAgfCAnTCdcbiAgfCAnTSdcbiAgfCAnTidcbiAgfCAnTydcbiAgfCAnUCdcbiAgfCAnUSdcbiAgfCAnUidcbiAgfCAnUydcbiAgfCAnVCdcbiAgfCAnVSdcbiAgfCAnVidcbiAgfCAnVydcbiAgfCAnWCdcbiAgfCAnWSdcbiAgfCAnWic7XG5cbnR5cGUgTG93ZXJjYXNlTGV0dGVycyA9XG4gIHwgJ2EnXG4gIHwgJ2InXG4gIHwgJ2MnXG4gIHwgJ2QnXG4gIHwgJ2UnXG4gIHwgJ2YnXG4gIHwgJ2cnXG4gIHwgJ2gnXG4gIHwgJ2knXG4gIHwgJ2onXG4gIHwgJ2snXG4gIHwgJ2wnXG4gIHwgJ20nXG4gIHwgJ24nXG4gIHwgJ28nXG4gIHwgJ3AnXG4gIHwgJ3EnXG4gIHwgJ3InXG4gIHwgJ3MnXG4gIHwgJ3QnXG4gIHwgJ3UnXG4gIHwgJ3YnXG4gIHwgJ3cnXG4gIHwgJ3gnXG4gIHwgJ3knXG4gIHwgJ3onO1xuXG50eXBlIE51bWJlcnMgPSAnMCcgfCAnMScgfCAnMicgfCAnMycgfCAnNCcgfCAnNScgfCAnNicgfCAnNycgfCAnOCcgfCAnOSc7XG4iXX0=
package/package.json CHANGED
@@ -62,7 +62,7 @@
62
62
  ]
63
63
  }
64
64
  },
65
- "version": "2.3.2",
65
+ "version": "3.0.0",
66
66
  "types": "lib/index.d.ts",
67
67
  "exports": {
68
68
  ".": {