angular-odata 0.122.0 → 0.124.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/esm2022/lib/api.mjs +373 -0
- package/esm2022/lib/cache/cache.mjs +175 -0
- package/{esm2020 → esm2022}/lib/cache/storage.mjs +1 -1
- package/esm2022/lib/client.mjs +252 -0
- package/{esm2020 → esm2022}/lib/helper.mjs +1 -1
- package/{esm2020 → esm2022}/lib/loaders.mjs +1 -1
- package/esm2022/lib/models/collection.mjs +865 -0
- package/esm2022/lib/models/model.mjs +535 -0
- package/esm2022/lib/models/options.mjs +1117 -0
- package/{esm2020 → esm2022}/lib/module.mjs +5 -5
- package/esm2022/lib/resources/path/segments.mjs +124 -0
- package/esm2022/lib/resources/query/builder.mjs +624 -0
- package/esm2022/lib/resources/query/expressions/base.mjs +20 -0
- package/esm2022/lib/resources/query/expressions/compute.mjs +39 -0
- package/esm2022/lib/resources/query/expressions/count.mjs +99 -0
- package/esm2022/lib/resources/query/expressions/expand.mjs +125 -0
- package/esm2022/lib/resources/query/expressions/filter.mjs +161 -0
- package/esm2022/lib/resources/query/expressions/orderby.mjs +56 -0
- package/esm2022/lib/resources/query/expressions/search.mjs +122 -0
- package/esm2022/lib/resources/query/expressions/select.mjs +31 -0
- package/esm2022/lib/resources/query/expressions/syntax.mjs +444 -0
- package/{esm2020 → esm2022}/lib/resources/query/handlers.mjs +1 -1
- package/esm2022/lib/resources/query/options.mjs +115 -0
- package/{esm2020 → esm2022}/lib/resources/request.mjs +1 -1
- package/esm2022/lib/resources/resource.mjs +257 -0
- package/{esm2020 → esm2022}/lib/resources/responses/annotations.mjs +1 -1
- package/esm2022/lib/resources/responses/csdl/csdl-annotation.mjs +33 -0
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-entity-container.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-entity-set.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-enum-type.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-function-action.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-reference.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-schema.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-singleton.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-structural-property.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-structured-type.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/responses/csdl/csdl-type-definition.mjs +1 -1
- package/esm2022/lib/resources/responses/metadata.mjs +547 -0
- package/{esm2020 → esm2022}/lib/resources/responses/response.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/action.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/batch.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/count.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/entity-set.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/entity.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/function.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/media.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/navigation-property.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/property.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/reference.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/singleton.mjs +1 -1
- package/{esm2020 → esm2022}/lib/resources/types/value.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/annotation.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/callable.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/element.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/entity-container.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/enum-type.mjs +1 -1
- package/{esm2020 → esm2022}/lib/schema/parsers/callable.mjs +1 -1
- package/esm2022/lib/schema/parsers/edm.mjs +99 -0
- package/{esm2020 → esm2022}/lib/schema/parsers/enum-type.mjs +2 -2
- package/esm2022/lib/schema/parsers/structured-type.mjs +502 -0
- package/{esm2020 → esm2022}/lib/schema/schema.mjs +1 -1
- package/esm2022/lib/schema/structured-type.mjs +207 -0
- package/esm2022/lib/services/base.mjs +29 -0
- package/{esm2020 → esm2022}/lib/services/entity-set.mjs +1 -1
- package/{esm2020 → esm2022}/lib/services/factory.mjs +4 -4
- package/{esm2020 → esm2022}/lib/services/singleton.mjs +1 -1
- package/{esm2020 → esm2022}/lib/settings.mjs +1 -1
- package/{esm2020 → esm2022}/lib/types.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/arrays.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/durations.mjs +1 -1
- package/esm2022/lib/utils/enums.mjs +61 -0
- package/{esm2020 → esm2022}/lib/utils/http.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/objects.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/odata.mjs +1 -1
- package/esm2022/lib/utils/types.mjs +136 -0
- package/{fesm2020 → fesm2022}/angular-odata.mjs +544 -373
- package/fesm2022/angular-odata.mjs.map +1 -0
- package/lib/helper.d.ts +1 -1
- package/lib/models/model.d.ts +4 -2
- package/lib/models/options.d.ts +7 -8
- package/lib/resources/path/segments.d.ts +15 -6
- package/lib/resources/query/builder.d.ts +21 -20
- package/lib/resources/query/expressions/base.d.ts +6 -4
- package/lib/resources/query/expressions/compute.d.ts +10 -8
- package/lib/resources/query/expressions/count.d.ts +14 -11
- package/lib/resources/query/expressions/expand.d.ts +23 -19
- package/lib/resources/query/expressions/filter.d.ts +22 -20
- package/lib/resources/query/expressions/orderby.d.ts +12 -9
- package/lib/resources/query/expressions/search.d.ts +12 -9
- package/lib/resources/query/expressions/select.d.ts +9 -7
- package/lib/resources/query/expressions/syntax.d.ts +75 -71
- package/lib/resources/query/handlers.d.ts +2 -2
- package/lib/resources/query/options.d.ts +15 -6
- package/lib/resources/resource.d.ts +2 -2
- package/lib/resources/responses/types.d.ts +3 -3
- package/lib/resources/types/options.d.ts +7 -7
- package/lib/schema/parsers/structured-type.d.ts +8 -5
- package/lib/schema/structured-type.d.ts +2 -1
- package/lib/types.d.ts +15 -15
- package/lib/utils/durations.d.ts +1 -1
- package/lib/utils/enums.d.ts +3 -0
- package/lib/utils/types.d.ts +1 -0
- package/package.json +9 -15
- package/esm2020/lib/api.mjs +0 -373
- package/esm2020/lib/cache/cache.mjs +0 -173
- package/esm2020/lib/client.mjs +0 -252
- package/esm2020/lib/models/collection.mjs +0 -861
- package/esm2020/lib/models/model.mjs +0 -507
- package/esm2020/lib/models/options.mjs +0 -1110
- package/esm2020/lib/resources/path/segments.mjs +0 -124
- package/esm2020/lib/resources/query/builder.mjs +0 -588
- package/esm2020/lib/resources/query/expressions/base.mjs +0 -20
- package/esm2020/lib/resources/query/expressions/compute.mjs +0 -39
- package/esm2020/lib/resources/query/expressions/count.mjs +0 -89
- package/esm2020/lib/resources/query/expressions/expand.mjs +0 -115
- package/esm2020/lib/resources/query/expressions/filter.mjs +0 -161
- package/esm2020/lib/resources/query/expressions/orderby.mjs +0 -56
- package/esm2020/lib/resources/query/expressions/search.mjs +0 -122
- package/esm2020/lib/resources/query/expressions/select.mjs +0 -31
- package/esm2020/lib/resources/query/expressions/syntax.mjs +0 -409
- package/esm2020/lib/resources/query/options.mjs +0 -115
- package/esm2020/lib/resources/resource.mjs +0 -251
- package/esm2020/lib/resources/responses/csdl/csdl-annotation.mjs +0 -33
- package/esm2020/lib/resources/responses/metadata.mjs +0 -547
- package/esm2020/lib/schema/parsers/edm.mjs +0 -104
- package/esm2020/lib/schema/parsers/structured-type.mjs +0 -490
- package/esm2020/lib/schema/structured-type.mjs +0 -202
- package/esm2020/lib/services/base.mjs +0 -29
- package/esm2020/lib/utils/enums.mjs +0 -45
- package/esm2020/lib/utils/types.mjs +0 -133
- package/fesm2015/angular-odata.mjs +0 -11811
- package/fesm2015/angular-odata.mjs.map +0 -1
- package/fesm2020/angular-odata.mjs.map +0 -1
- /package/{esm2020 → esm2022}/angular-odata.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/cache/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/cache/memory.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/constants.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/path/handlers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/path/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/query/expressions/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/query/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/responses/types.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/metadata.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/resources/types/options.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/entity-set.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/schema/parsers/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/entity.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/services/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/arraybuffers.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/dates.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/strings.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/urls.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
import { Objects, Types } from '../../../utils';
|
|
2
|
+
import { normalizeValue } from '../builder';
|
|
3
|
+
export const FieldFactory = (names = []) => new Proxy({ _names: names }, {
|
|
4
|
+
get(target, key) {
|
|
5
|
+
let names = target['_names'];
|
|
6
|
+
if (key === 'render') {
|
|
7
|
+
return ({ prefix }) => prefix ? `${prefix}/${names.join('/')}` : names.join('/');
|
|
8
|
+
}
|
|
9
|
+
else if (key === 'clone') {
|
|
10
|
+
return () => FieldFactory([...names]);
|
|
11
|
+
}
|
|
12
|
+
else if (key === 'isField') {
|
|
13
|
+
return () => true;
|
|
14
|
+
}
|
|
15
|
+
else if (key === 'toJSON') {
|
|
16
|
+
return () => ({
|
|
17
|
+
$type: 'Field',
|
|
18
|
+
names: names,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
else if (key === 'resolve') {
|
|
22
|
+
return (parser) => names.reduce((acc, name) => acc.field(name), parser);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
return FieldFactory([...names, key]);
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
has(target, key) {
|
|
29
|
+
return (['toJSON', 'isField', 'clone', 'render', 'resolve'].includes(key) ||
|
|
30
|
+
key in target);
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
function applyMixins(derivedCtor, constructors) {
|
|
34
|
+
constructors.forEach((baseCtor) => {
|
|
35
|
+
Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {
|
|
36
|
+
Object.defineProperty(derivedCtor.prototype, name, Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||
|
|
37
|
+
Object.create(null));
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export function render(value, { aliases, normalize, escape, prefix, parser, } = {}) {
|
|
42
|
+
if (Types.isFunction(value)) {
|
|
43
|
+
return render(value(syntax), { aliases, normalize, prefix, parser });
|
|
44
|
+
}
|
|
45
|
+
if (Types.isObject(value) && 'render' in value) {
|
|
46
|
+
return render(value.render({ aliases, escape, prefix, parser }), {
|
|
47
|
+
aliases,
|
|
48
|
+
normalize,
|
|
49
|
+
escape,
|
|
50
|
+
prefix,
|
|
51
|
+
parser,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return normalize ? normalizeValue(value, { aliases, escape }) : value;
|
|
55
|
+
}
|
|
56
|
+
export function resolve(values, parser) {
|
|
57
|
+
if (parser !== undefined) {
|
|
58
|
+
let fields = values.filter((v) => Types.isObject(v) && 'isField' in v && v.isField());
|
|
59
|
+
if (fields.length === 1 && Types.isObject(parser) && 'field' in parser) {
|
|
60
|
+
return fields[0].resolve(parser);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return parser;
|
|
64
|
+
}
|
|
65
|
+
export function encode(values, parser) {
|
|
66
|
+
if (parser !== undefined) {
|
|
67
|
+
return values.map((v) => Types.isObject(v) || v === null ? v : parser?.encode(v));
|
|
68
|
+
}
|
|
69
|
+
return values;
|
|
70
|
+
}
|
|
71
|
+
export class Function {
|
|
72
|
+
constructor(name, values, normalize, escape = false) {
|
|
73
|
+
this.name = name;
|
|
74
|
+
this.values = values;
|
|
75
|
+
this.normalize = normalize;
|
|
76
|
+
this.escape = escape;
|
|
77
|
+
}
|
|
78
|
+
get [Symbol.toStringTag]() {
|
|
79
|
+
return 'Function';
|
|
80
|
+
}
|
|
81
|
+
toJSON() {
|
|
82
|
+
return {
|
|
83
|
+
$type: Types.rawType(this),
|
|
84
|
+
name: this.name,
|
|
85
|
+
values: this.values.map((v) => Types.isObject(v) && 'toJSON' in v ? v.toJSON() : v),
|
|
86
|
+
normalize: this.normalize,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
render({ aliases, escape, prefix, parser, }) {
|
|
90
|
+
parser = resolve(this.values, parser);
|
|
91
|
+
let [left, ...values] = encode(this.values, parser);
|
|
92
|
+
left = render(left, {
|
|
93
|
+
aliases,
|
|
94
|
+
escape,
|
|
95
|
+
prefix,
|
|
96
|
+
parser,
|
|
97
|
+
normalize: this.normalize === 'all' || this.normalize === 'left',
|
|
98
|
+
});
|
|
99
|
+
const params = [
|
|
100
|
+
left,
|
|
101
|
+
...values.map((v) => render(v, {
|
|
102
|
+
aliases,
|
|
103
|
+
escape,
|
|
104
|
+
prefix,
|
|
105
|
+
parser,
|
|
106
|
+
normalize: this.normalize === 'all' || this.normalize === 'right',
|
|
107
|
+
})),
|
|
108
|
+
];
|
|
109
|
+
return `${this.name}(${params.join(', ')})`;
|
|
110
|
+
}
|
|
111
|
+
clone() {
|
|
112
|
+
return new Function(this.name, this.values.map((v) => Objects.clone(v)), this.normalize, this.escape);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export class StringAndCollectionFunctions {
|
|
116
|
+
concat(left, right, normalize = 'right') {
|
|
117
|
+
return new Function('concat', [left, right], normalize);
|
|
118
|
+
}
|
|
119
|
+
contains(left, right, normalize = 'right') {
|
|
120
|
+
return new Function('contains', [left, right], normalize);
|
|
121
|
+
}
|
|
122
|
+
endsWith(left, right, normalize = 'right') {
|
|
123
|
+
return new Function('endswith', [left, right], normalize);
|
|
124
|
+
}
|
|
125
|
+
indexOf(left, right, normalize = 'right') {
|
|
126
|
+
return new Function('indexof', [left, right], normalize);
|
|
127
|
+
}
|
|
128
|
+
length(left, normalize = 'right') {
|
|
129
|
+
return new Function('length', [left], normalize);
|
|
130
|
+
}
|
|
131
|
+
startsWith(left, right, normalize = 'right') {
|
|
132
|
+
return new Function('startswith', [left, right], normalize);
|
|
133
|
+
}
|
|
134
|
+
subString(left, right, length, normalize = 'none') {
|
|
135
|
+
let values = [left, right];
|
|
136
|
+
if (length !== undefined) {
|
|
137
|
+
values.push(length);
|
|
138
|
+
}
|
|
139
|
+
return new Function('substring', values, normalize);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
export class CollectionFunctions {
|
|
143
|
+
hasSubset(left, right, normalize = 'none') {
|
|
144
|
+
return new Function('hassubset', [left, right], normalize);
|
|
145
|
+
}
|
|
146
|
+
hasSubsequence(left, right, normalize = 'none') {
|
|
147
|
+
return new Function('hassubsequence', [left, right], normalize);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export class StringFunctions {
|
|
151
|
+
matchesPattern(left, pattern, normalize = 'none') {
|
|
152
|
+
return new Function('matchesPattern', [left, pattern], normalize);
|
|
153
|
+
}
|
|
154
|
+
toLower(left, normalize = 'none') {
|
|
155
|
+
return new Function('tolower', [left], normalize);
|
|
156
|
+
}
|
|
157
|
+
toUpper(left, normalize = 'none') {
|
|
158
|
+
return new Function('toupper', [left], normalize);
|
|
159
|
+
}
|
|
160
|
+
trim(left, normalize = 'none') {
|
|
161
|
+
return new Function('trim', [left], normalize);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
export class DateAndTimeFunctions {
|
|
165
|
+
date(left, normalize = 'none') {
|
|
166
|
+
return new Function('date', [left], normalize);
|
|
167
|
+
}
|
|
168
|
+
day(left, normalize = 'none') {
|
|
169
|
+
return new Function('day', [left], normalize);
|
|
170
|
+
}
|
|
171
|
+
fractionalseconds(left, normalize = 'none') {
|
|
172
|
+
return new Function('fractionalseconds', [left], normalize);
|
|
173
|
+
}
|
|
174
|
+
hour(left, normalize = 'none') {
|
|
175
|
+
return new Function('hour', [left], normalize);
|
|
176
|
+
}
|
|
177
|
+
maxdatetime(left, normalize = 'none') {
|
|
178
|
+
return new Function('maxdatetime', [left], normalize);
|
|
179
|
+
}
|
|
180
|
+
mindatetime(left, normalize = 'none') {
|
|
181
|
+
return new Function('mindatetime', [left], normalize);
|
|
182
|
+
}
|
|
183
|
+
minute(left, normalize = 'none') {
|
|
184
|
+
return new Function('minute', [left], normalize);
|
|
185
|
+
}
|
|
186
|
+
month(left, normalize = 'none') {
|
|
187
|
+
return new Function('month', [left], normalize);
|
|
188
|
+
}
|
|
189
|
+
now() {
|
|
190
|
+
return new Function('now', [], 'none');
|
|
191
|
+
}
|
|
192
|
+
second(left, normalize = 'none') {
|
|
193
|
+
return new Function('second', [left], normalize);
|
|
194
|
+
}
|
|
195
|
+
time(left, normalize = 'none') {
|
|
196
|
+
return new Function('time', [left], normalize);
|
|
197
|
+
}
|
|
198
|
+
totaloffsetminutes(left, normalize = 'none') {
|
|
199
|
+
return new Function('totaloffsetminutes', [left], normalize);
|
|
200
|
+
}
|
|
201
|
+
totalseconds(left, normalize = 'none') {
|
|
202
|
+
return new Function('totalseconds', [left], normalize);
|
|
203
|
+
}
|
|
204
|
+
year(left, normalize = 'none') {
|
|
205
|
+
return new Function('year', [left], normalize);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
export class ArithmeticFunctions {
|
|
209
|
+
ceiling(left, normalize = 'none') {
|
|
210
|
+
return new Function('ceiling', [left], normalize);
|
|
211
|
+
}
|
|
212
|
+
floor(left, normalize = 'none') {
|
|
213
|
+
return new Function('floor', [left], normalize);
|
|
214
|
+
}
|
|
215
|
+
round(left, normalize = 'none') {
|
|
216
|
+
return new Function('round', [left], normalize);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
export class TypeFunctions {
|
|
220
|
+
cast(left, right, normalize = 'right') {
|
|
221
|
+
return new Function('cast', [left, right], normalize);
|
|
222
|
+
}
|
|
223
|
+
isof(left, right, normalize = 'right') {
|
|
224
|
+
return new Function('isof', [left, right], normalize);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
export class GeoFunctions {
|
|
228
|
+
geoDistance(left, right, normalize = 'right') {
|
|
229
|
+
return new Function('geo.distance', [left, right], normalize);
|
|
230
|
+
}
|
|
231
|
+
geoIntersects(left, right, normalize = 'right') {
|
|
232
|
+
return new Function('geo.intersects', [left, right], normalize);
|
|
233
|
+
}
|
|
234
|
+
geoLength(left, normalize = 'none') {
|
|
235
|
+
return new Function('geo.length', [left], normalize);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
export class ConditionalFunctions {
|
|
239
|
+
case(left, right, normalize = 'none') {
|
|
240
|
+
return new Function('case', [left, right], normalize);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
export class Operator {
|
|
244
|
+
constructor(op, values, normalize) {
|
|
245
|
+
this.op = op;
|
|
246
|
+
this.values = values;
|
|
247
|
+
this.normalize = normalize;
|
|
248
|
+
}
|
|
249
|
+
get [Symbol.toStringTag]() {
|
|
250
|
+
return 'Operator';
|
|
251
|
+
}
|
|
252
|
+
toJSON() {
|
|
253
|
+
return {
|
|
254
|
+
$type: Types.rawType(this),
|
|
255
|
+
op: this.op,
|
|
256
|
+
values: this.values.map((v) => Types.isObject(v) && 'toJSON' in v ? v.toJSON() : v),
|
|
257
|
+
normalize: this.normalize,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
render({ aliases, escape, prefix, parser, }) {
|
|
261
|
+
parser = resolve(this.values, parser);
|
|
262
|
+
let [left, right] = encode(this.values, parser);
|
|
263
|
+
left = render(left, {
|
|
264
|
+
aliases,
|
|
265
|
+
escape,
|
|
266
|
+
prefix,
|
|
267
|
+
parser,
|
|
268
|
+
normalize: this.normalize === 'all' || this.normalize === 'left',
|
|
269
|
+
});
|
|
270
|
+
if (right !== undefined) {
|
|
271
|
+
right = Array.isArray(right)
|
|
272
|
+
? `(${right
|
|
273
|
+
.map((v) => render(v, {
|
|
274
|
+
aliases,
|
|
275
|
+
escape,
|
|
276
|
+
prefix,
|
|
277
|
+
parser,
|
|
278
|
+
normalize: this.normalize === 'all' || this.normalize === 'right',
|
|
279
|
+
}))
|
|
280
|
+
.join(',')})`
|
|
281
|
+
: render(right, {
|
|
282
|
+
aliases,
|
|
283
|
+
escape,
|
|
284
|
+
prefix,
|
|
285
|
+
parser,
|
|
286
|
+
normalize: this.normalize === 'all' || this.normalize === 'right',
|
|
287
|
+
});
|
|
288
|
+
return `${left} ${this.op} ${right}`;
|
|
289
|
+
}
|
|
290
|
+
return `${this.op}(${left})`;
|
|
291
|
+
}
|
|
292
|
+
clone() {
|
|
293
|
+
return new Operator(this.op, this.values.map((v) => Objects.clone(v)), this.normalize);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
export class LogicalOperators {
|
|
297
|
+
eq(left, right, normalize = 'right') {
|
|
298
|
+
return new Operator('eq', [left, right], normalize);
|
|
299
|
+
}
|
|
300
|
+
ne(left, right, normalize = 'right') {
|
|
301
|
+
return new Operator('ne', [left, right], normalize);
|
|
302
|
+
}
|
|
303
|
+
gt(left, right, normalize = 'right') {
|
|
304
|
+
return new Operator('gt', [left, right], normalize);
|
|
305
|
+
}
|
|
306
|
+
ge(left, right, normalize = 'right') {
|
|
307
|
+
return new Operator('ge', [left, right], normalize);
|
|
308
|
+
}
|
|
309
|
+
lt(left, right, normalize = 'right') {
|
|
310
|
+
return new Operator('lt', [left, right], normalize);
|
|
311
|
+
}
|
|
312
|
+
le(left, right, normalize = 'right') {
|
|
313
|
+
return new Operator('le', [left, right], normalize);
|
|
314
|
+
}
|
|
315
|
+
/*
|
|
316
|
+
and(left: any, right: any, normalize: Normalize = 'right') {
|
|
317
|
+
return new Operator('and', [left, right], normalize);
|
|
318
|
+
}
|
|
319
|
+
or(left: any, right: any, normalize: Normalize = 'right') {
|
|
320
|
+
return new Operator('or', [left, right], normalize);
|
|
321
|
+
}
|
|
322
|
+
*/
|
|
323
|
+
not(left, normalize = 'none') {
|
|
324
|
+
return new Operator('not', [left], normalize);
|
|
325
|
+
}
|
|
326
|
+
has(left, right, normalize = 'right') {
|
|
327
|
+
return new Operator('has', [left, right], normalize);
|
|
328
|
+
}
|
|
329
|
+
in(left, right, normalize = 'right') {
|
|
330
|
+
return new Operator('in', [left, right], normalize);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
export class ArithmeticOperators {
|
|
334
|
+
add(left, right, normalize = 'right') {
|
|
335
|
+
return new Operator('add', [left, right], normalize);
|
|
336
|
+
}
|
|
337
|
+
sub(left, right, normalize = 'right') {
|
|
338
|
+
return new Operator('sub', [left, right], normalize);
|
|
339
|
+
}
|
|
340
|
+
mul(left, right, normalize = 'right') {
|
|
341
|
+
return new Operator('mul', [left, right], normalize);
|
|
342
|
+
}
|
|
343
|
+
div(left, right, normalize = 'right') {
|
|
344
|
+
return new Operator('div', [left, right], normalize);
|
|
345
|
+
}
|
|
346
|
+
mod(left, right, normalize = 'right') {
|
|
347
|
+
return new Operator('mod', [left, right], normalize);
|
|
348
|
+
}
|
|
349
|
+
neg(value, normalize = 'right') {
|
|
350
|
+
return new Operator('-', [value], normalize);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
export class Grouping {
|
|
354
|
+
constructor(group) {
|
|
355
|
+
this.group = group;
|
|
356
|
+
}
|
|
357
|
+
get [Symbol.toStringTag]() {
|
|
358
|
+
return 'Grouping';
|
|
359
|
+
}
|
|
360
|
+
toJSON() {
|
|
361
|
+
return {
|
|
362
|
+
$type: Types.rawType(this),
|
|
363
|
+
group: this.group.toJSON(),
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
render({ aliases, escape, prefix, parser, }) {
|
|
367
|
+
return `(${render(this.group, { aliases, escape, prefix, parser })})`;
|
|
368
|
+
}
|
|
369
|
+
clone() {
|
|
370
|
+
return new Grouping(Objects.clone(this.group));
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
export class Lambda {
|
|
374
|
+
constructor(op, values, alias) {
|
|
375
|
+
this.op = op;
|
|
376
|
+
this.values = values;
|
|
377
|
+
this.alias = alias;
|
|
378
|
+
}
|
|
379
|
+
get [Symbol.toStringTag]() {
|
|
380
|
+
return 'Lambda';
|
|
381
|
+
}
|
|
382
|
+
toJSON() {
|
|
383
|
+
return {
|
|
384
|
+
$type: Types.rawType(this),
|
|
385
|
+
op: this.op,
|
|
386
|
+
values: this.values.map((v) => Types.isObject(v) && 'toJSON' in v ? v.toJSON() : v),
|
|
387
|
+
alias: this.alias,
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
render({ aliases, escape, prefix, parser, }) {
|
|
391
|
+
parser = resolve(this.values, parser);
|
|
392
|
+
let [left, right] = encode(this.values, parser);
|
|
393
|
+
left = render(left, { aliases, escape, prefix, parser });
|
|
394
|
+
if (right) {
|
|
395
|
+
let alias = this.alias || left.split('/').pop().toLowerCase()[0];
|
|
396
|
+
return `${left}/${this.op}(${alias}:${render(right, {
|
|
397
|
+
aliases,
|
|
398
|
+
escape,
|
|
399
|
+
prefix: alias,
|
|
400
|
+
parser,
|
|
401
|
+
})})`;
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
return `${left}/${this.op}()`;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
clone() {
|
|
408
|
+
return new Lambda(this.op, this.values.map((v) => Objects.clone(v)), this.alias);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
export class LambdaOperators {
|
|
412
|
+
any(left, right, alias) {
|
|
413
|
+
return new Lambda('any', [left, right], alias);
|
|
414
|
+
}
|
|
415
|
+
all(left, right, alias) {
|
|
416
|
+
return new Lambda('all', [left, right], alias);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
export class ODataOperators {
|
|
420
|
+
}
|
|
421
|
+
applyMixins(ODataOperators, [
|
|
422
|
+
LogicalOperators,
|
|
423
|
+
ArithmeticOperators,
|
|
424
|
+
LambdaOperators,
|
|
425
|
+
]);
|
|
426
|
+
export const operators = new ODataOperators();
|
|
427
|
+
export class ODataFunctions {
|
|
428
|
+
}
|
|
429
|
+
applyMixins(ODataFunctions, [
|
|
430
|
+
StringAndCollectionFunctions,
|
|
431
|
+
CollectionFunctions,
|
|
432
|
+
StringFunctions,
|
|
433
|
+
DateAndTimeFunctions,
|
|
434
|
+
ArithmeticFunctions,
|
|
435
|
+
TypeFunctions,
|
|
436
|
+
GeoFunctions,
|
|
437
|
+
ConditionalFunctions,
|
|
438
|
+
]);
|
|
439
|
+
export const functions = new ODataFunctions();
|
|
440
|
+
export class ODataSyntax {
|
|
441
|
+
}
|
|
442
|
+
applyMixins(ODataSyntax, [ODataOperators, ODataFunctions]);
|
|
443
|
+
export const syntax = new ODataSyntax();
|
|
444
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3Jlc291cmNlcy9xdWVyeS9leHByZXNzaW9ucy9zeW50YXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBcUI1QyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBbUIsUUFBa0IsRUFBRSxFQUFPLEVBQUUsQ0FDMUUsSUFBSSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFPLEVBQUU7SUFDaEMsR0FBRyxDQUFDLE1BQVMsRUFBRSxHQUFvQjtRQUNqQyxJQUFJLEtBQUssR0FBSSxNQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsSUFBSSxHQUFHLEtBQUssUUFBUSxFQUFFO1lBQ3BCLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBdUIsRUFBRSxFQUFFLENBQ3pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzdEO2FBQU0sSUFBSSxHQUFHLEtBQUssT0FBTyxFQUFFO1lBQzFCLE9BQU8sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDO2FBQU0sSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO1lBQzVCLE9BQU8sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1NBQ25CO2FBQU0sSUFBSSxHQUFHLEtBQUssUUFBUSxFQUFFO1lBQzNCLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDWixLQUFLLEVBQUUsT0FBTztnQkFDZCxLQUFLLEVBQUUsS0FBSzthQUNiLENBQUMsQ0FBQztTQUNKO2FBQU0sSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO1lBQzVCLE9BQU8sQ0FBQyxNQUFXLEVBQUUsRUFBRSxDQUNyQixLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBUSxFQUFFLElBQVksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNyRTthQUFNO1lBQ0wsT0FBTyxZQUFZLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUVELEdBQUcsQ0FBQyxNQUFTLEVBQUUsR0FBVztRQUN4QixPQUFPLENBQ0wsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUNqRSxHQUFHLElBQUksTUFBTSxDQUNkLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBRUwsU0FBUyxXQUFXLENBQUMsV0FBZ0IsRUFBRSxZQUFtQjtJQUN4RCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDaEMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM5RCxNQUFNLENBQUMsY0FBYyxDQUNuQixXQUFXLENBQUMsU0FBUyxFQUNyQixJQUFJLEVBQ0osTUFBTSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDO2dCQUN2RCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUN0QixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsTUFBTSxDQUNwQixLQUFVLEVBQ1YsRUFDRSxPQUFPLEVBQ1AsU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEVBQ04sTUFBTSxNQU9KLEVBQUU7SUFFTixJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDM0IsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztLQUN0RTtJQUNELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxRQUFRLElBQUksS0FBSyxFQUFFO1FBQzlDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFO1lBQy9ELE9BQU87WUFDUCxTQUFTO1lBQ1QsTUFBTTtZQUNOLE1BQU07WUFDTixNQUFNO1NBQ1AsQ0FBQyxDQUFDO0tBQ0o7SUFDRCxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDeEUsQ0FBQztBQUVELE1BQU0sVUFBVSxPQUFPLENBQUMsTUFBVyxFQUFFLE1BQW9CO0lBQ3ZELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtRQUN4QixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUN4QixDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FDL0QsQ0FBQztRQUNGLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLElBQUksTUFBTSxFQUFFO1lBQ3RFLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNsQztLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sVUFBVSxNQUFNLENBQUMsTUFBVyxFQUFFLE1BQW9CO0lBQ3RELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtRQUN4QixPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUMzQixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FDeEQsQ0FBQztLQUNIO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sT0FBTyxRQUFRO0lBQ25CLFlBQ1ksSUFBWSxFQUNaLE1BQWEsRUFDYixTQUFvQixFQUNwQixTQUFrQixLQUFLO1FBSHZCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixXQUFNLEdBQU4sTUFBTSxDQUFPO1FBQ2IsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixXQUFNLEdBQU4sTUFBTSxDQUFpQjtJQUNoQyxDQUFDO0lBRUosSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDdEIsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPO1lBQ0wsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzVCLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3BEO1lBQ0QsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzFCLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLEVBQ0wsT0FBTyxFQUNQLE1BQU0sRUFDTixNQUFNLEVBQ04sTUFBTSxHQU1QO1FBQ0MsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVwRCxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRTtZQUNsQixPQUFPO1lBQ1AsTUFBTTtZQUNOLE1BQU07WUFDTixNQUFNO1lBQ04sU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTTtTQUNqRSxDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRztZQUNiLElBQUk7WUFDSixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUN2QixNQUFNLENBQUMsQ0FBQyxFQUFFO2dCQUNSLE9BQU87Z0JBQ1AsTUFBTTtnQkFDTixNQUFNO2dCQUNOLE1BQU07Z0JBQ04sU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssT0FBTzthQUNsRSxDQUFDLENBQ0g7U0FDRixDQUFDO1FBQ0YsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQzlDLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLFFBQVEsQ0FDakIsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUN4QyxJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksQ0FBQyxNQUFNLENBQ1osQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyw0QkFBNEI7SUFDdkMsTUFBTSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUMxRCxPQUFPLElBQUksUUFBUSxDQUFJLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsUUFBUSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUM1RCxPQUFPLElBQUksUUFBUSxDQUFJLFVBQVUsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsUUFBUSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUM1RCxPQUFPLElBQUksUUFBUSxDQUFJLFVBQVUsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUMzRCxPQUFPLElBQUksUUFBUSxDQUFJLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQVMsRUFBRSxZQUF1QixPQUFPO1FBQzlDLE9BQU8sSUFBSSxRQUFRLENBQUksUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDOUQsT0FBTyxJQUFJLFFBQVEsQ0FBSSxZQUFZLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELFNBQVMsQ0FDUCxJQUFTLEVBQ1QsS0FBYSxFQUNiLE1BQWUsRUFDZixZQUF1QixNQUFNO1FBRTdCLElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxJQUFJLFFBQVEsQ0FBSSxXQUFXLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsU0FBUyxDQUFDLElBQU8sRUFBRSxLQUFVLEVBQUUsWUFBdUIsTUFBTTtRQUMxRCxPQUFPLElBQUksUUFBUSxDQUFJLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBQ0QsY0FBYyxDQUFDLElBQU8sRUFBRSxLQUFVLEVBQUUsWUFBdUIsTUFBTTtRQUMvRCxPQUFPLElBQUksUUFBUSxDQUFJLGdCQUFnQixFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxlQUFlO0lBQzFCLGNBQWMsQ0FDWixJQUFrQixFQUNsQixPQUFlLEVBQ2YsWUFBdUIsTUFBTTtRQUU3QixPQUFPLElBQUksUUFBUSxDQUFJLGdCQUFnQixFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxPQUFPLENBQUMsSUFBUyxFQUFFLFlBQXVCLE1BQU07UUFDOUMsT0FBTyxJQUFJLFFBQVEsQ0FBSSxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsT0FBTyxDQUFDLElBQVMsRUFBRSxZQUF1QixNQUFNO1FBQzlDLE9BQU8sSUFBSSxRQUFRLENBQUksU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELElBQUksQ0FBQyxJQUFTLEVBQUUsWUFBdUIsTUFBTTtRQUMzQyxPQUFPLElBQUksUUFBUSxDQUFJLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxvQkFBb0I7SUFDL0IsSUFBSSxDQUFDLElBQVMsRUFBRSxZQUF1QixNQUFNO1FBQzNDLE9BQU8sSUFBSSxRQUFRLENBQUksTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUNELEdBQUcsQ0FBQyxJQUFTLEVBQUUsWUFBdUIsTUFBTTtRQUMxQyxPQUFPLElBQUksUUFBUSxDQUFJLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxJQUFTLEVBQUUsWUFBdUIsTUFBTTtRQUN4RCxPQUFPLElBQUksUUFBUSxDQUFJLG1CQUFtQixFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUNELElBQUksQ0FBQyxJQUFTLEVBQUUsWUFBdUIsTUFBTTtRQUMzQyxPQUFPLElBQUksUUFBUSxDQUFJLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDRCxXQUFXLENBQUMsSUFBUyxFQUFFLFlBQXVCLE1BQU07UUFDbEQsT0FBTyxJQUFJLFFBQVEsQ0FBSSxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQ0QsV0FBVyxDQUFDLElBQVMsRUFBRSxZQUF1QixNQUFNO1FBQ2xELE9BQU8sSUFBSSxRQUFRLENBQUksYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUNELE1BQU0sQ0FBQyxJQUFTLEVBQUUsWUFBdUIsTUFBTTtRQUM3QyxPQUFPLElBQUksUUFBUSxDQUFJLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDRCxLQUFLLENBQUMsSUFBUyxFQUFFLFlBQXVCLE1BQU07UUFDNUMsT0FBTyxJQUFJLFFBQVEsQ0FBSSxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsR0FBRztRQUNELE9BQU8sSUFBSSxRQUFRLENBQUksS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsTUFBTSxDQUFDLElBQVMsRUFBRSxZQUF1QixNQUFNO1FBQzdDLE9BQU8sSUFBSSxRQUFRLENBQUksUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELElBQUksQ0FBQyxJQUFTLEVBQUUsWUFBdUIsTUFBTTtRQUMzQyxPQUFPLElBQUksUUFBUSxDQUFJLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxJQUFTLEVBQUUsWUFBdUIsTUFBTTtRQUN6RCxPQUFPLElBQUksUUFBUSxDQUFJLG9CQUFvQixFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELFlBQVksQ0FBQyxJQUFTLEVBQUUsWUFBdUIsTUFBTTtRQUNuRCxPQUFPLElBQUksUUFBUSxDQUFJLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFDRCxJQUFJLENBQUMsSUFBUyxFQUFFLFlBQXVCLE1BQU07UUFDM0MsT0FBTyxJQUFJLFFBQVEsQ0FBSSxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwRCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sbUJBQW1CO0lBQzlCLE9BQU8sQ0FBQyxJQUFnQixFQUFFLFlBQXVCLE1BQU07UUFDckQsT0FBTyxJQUFJLFFBQVEsQ0FBSSxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsS0FBSyxDQUFDLElBQWdCLEVBQUUsWUFBdUIsTUFBTTtRQUNuRCxPQUFPLElBQUksUUFBUSxDQUFJLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxLQUFLLENBQUMsSUFBZ0IsRUFBRSxZQUF1QixNQUFNO1FBQ25ELE9BQU8sSUFBSSxRQUFRLENBQUksT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDckQsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGFBQWE7SUFDeEIsSUFBSSxDQUFDLElBQWdCLEVBQUUsS0FBYyxFQUFFLFlBQXVCLE9BQU87UUFDbkUsT0FBTyxJQUFJLFFBQVEsQ0FBSSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELElBQUksQ0FBQyxJQUFnQixFQUFFLEtBQWMsRUFBRSxZQUF1QixPQUFPO1FBQ25FLE9BQU8sSUFBSSxRQUFRLENBQUksTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNELENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLFdBQVcsQ0FBQyxJQUFPLEVBQUUsS0FBYSxFQUFFLFlBQXVCLE9BQU87UUFDaEUsT0FBTyxJQUFJLFFBQVEsQ0FBSSxjQUFjLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNELGFBQWEsQ0FBQyxJQUFPLEVBQUUsS0FBYSxFQUFFLFlBQXVCLE9BQU87UUFDbEUsT0FBTyxJQUFJLFFBQVEsQ0FBSSxnQkFBZ0IsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBQ0QsU0FBUyxDQUFDLElBQU8sRUFBRSxZQUF1QixNQUFNO1FBQzlDLE9BQU8sSUFBSSxRQUFRLENBQUksWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDMUQsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQixJQUFJLENBQUMsSUFBZ0IsRUFBRSxLQUFVLEVBQUUsWUFBdUIsTUFBTTtRQUM5RCxPQUFPLElBQUksUUFBUSxDQUFJLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzRCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sUUFBUTtJQUNuQixZQUNZLEVBQVUsRUFDVixNQUFhLEVBQ2IsU0FBb0I7UUFGcEIsT0FBRSxHQUFGLEVBQUUsQ0FBUTtRQUNWLFdBQU0sR0FBTixNQUFNLENBQU87UUFDYixjQUFTLEdBQVQsU0FBUyxDQUFXO0lBQzdCLENBQUM7SUFFSixJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUN0QixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU87WUFDTCxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDMUIsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDNUIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDcEQ7WUFDRCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLENBQUMsRUFDTCxPQUFPLEVBQ1AsTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEdBTVA7UUFDQyxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVoRCxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRTtZQUNsQixPQUFPO1lBQ1AsTUFBTTtZQUNOLE1BQU07WUFDTixNQUFNO1lBQ04sU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTTtTQUNqRSxDQUFDLENBQUM7UUFDSCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUMxQixDQUFDLENBQUMsSUFBSSxLQUFLO3FCQUNOLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ1QsTUFBTSxDQUFDLENBQUMsRUFBRTtvQkFDUixPQUFPO29CQUNQLE1BQU07b0JBQ04sTUFBTTtvQkFDTixNQUFNO29CQUNOLFNBQVMsRUFDUCxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLE9BQU87aUJBQ3pELENBQUMsQ0FDSDtxQkFDQSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUc7Z0JBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO29CQUNaLE9BQU87b0JBQ1AsTUFBTTtvQkFDTixNQUFNO29CQUNOLE1BQU07b0JBQ04sU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssT0FBTztpQkFDbEUsQ0FBQyxDQUFDO1lBQ1AsT0FBTyxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLEtBQUssRUFBRSxDQUFDO1NBQ3RDO1FBQ0QsT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxHQUFHLENBQUM7SUFDL0IsQ0FBQztJQUVELEtBQUs7UUFDSCxPQUFPLElBQUksUUFBUSxDQUNqQixJQUFJLENBQUMsRUFBRSxFQUNQLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3hDLElBQUksQ0FBQyxTQUFTLENBQ2YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsRUFBRSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUN0RCxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsRUFBRSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUN0RCxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsRUFBRSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUN0RCxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsRUFBRSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUN0RCxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsRUFBRSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUN0RCxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsRUFBRSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUN0RCxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0Q7Ozs7Ozs7TUFPRTtJQUNGLEdBQUcsQ0FBQyxJQUFTLEVBQUUsWUFBdUIsTUFBTTtRQUMxQyxPQUFPLElBQUksUUFBUSxDQUFJLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxHQUFHLENBQUMsSUFBUyxFQUFFLEtBQVUsRUFBRSxZQUF1QixPQUFPO1FBQ3ZELE9BQU8sSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxFQUFFLENBQUMsSUFBUyxFQUFFLEtBQVUsRUFBRSxZQUF1QixPQUFPO1FBQ3RELE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsR0FBRyxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUN2RCxPQUFPLElBQUksUUFBUSxDQUFJLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBQ0QsR0FBRyxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUN2RCxPQUFPLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsR0FBRyxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUN2RCxPQUFPLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsR0FBRyxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUN2RCxPQUFPLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsR0FBRyxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsWUFBdUIsT0FBTztRQUN2RCxPQUFPLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBQ0QsR0FBRyxDQUFDLEtBQVUsRUFBRSxZQUF1QixPQUFPO1FBQzVDLE9BQU8sSUFBSSxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFFBQVE7SUFDbkIsWUFBc0IsS0FBaUI7UUFBakIsVUFBSyxHQUFMLEtBQUssQ0FBWTtJQUFHLENBQUM7SUFFM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDdEIsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPO1lBQ0wsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQzFCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtTQUMzQixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxFQUNMLE9BQU8sRUFDUCxNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sR0FNUDtRQUNDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUN4RSxDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sTUFBTTtJQUNqQixZQUNZLEVBQVUsRUFDVixNQUFhLEVBQ2IsS0FBYztRQUZkLE9BQUUsR0FBRixFQUFFLENBQVE7UUFDVixXQUFNLEdBQU4sTUFBTSxDQUFPO1FBQ2IsVUFBSyxHQUFMLEtBQUssQ0FBUztJQUN2QixDQUFDO0lBRUosSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDdEIsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPO1lBQ0wsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQzFCLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzVCLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3BEO1lBQ0QsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1NBQ2xCLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLEVBQ0wsT0FBTyxFQUNQLE1BQU0sRUFDTixNQUFNLEVBQ04sTUFBTSxHQU1QO1FBQ0MsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFaEQsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTtnQkFDbEQsT0FBTztnQkFDUCxNQUFNO2dCQUNOLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU07YUFDUCxDQUFDLEdBQUcsQ0FBQztTQUNQO2FBQU07WUFDTCxPQUFPLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQztTQUMvQjtJQUNILENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLE1BQU0sQ0FDZixJQUFJLENBQUMsRUFBRSxFQUNQLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3hDLElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxlQUFlO0lBQzFCLEdBQUcsQ0FBQyxJQUFPLEVBQUUsS0FBVSxFQUFFLEtBQWM7UUFDckMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUFPLEVBQUUsS0FBVSxFQUFFLEtBQWM7UUFDckMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGNBQWM7Q0FBTTtBQU1qQyxXQUFXLENBQUMsY0FBYyxFQUFFO0lBQzFCLGdCQUFnQjtJQUNoQixtQkFBbUI7SUFDbkIsZUFBZTtDQUNoQixDQUFDLENBQUM7QUFDSCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQXdCLElBQUksY0FBYyxFQUFPLENBQUM7QUFFeEUsTUFBTSxPQUFPLGNBQWM7Q0FBTTtBQVdqQyxXQUFXLENBQUMsY0FBYyxFQUFFO0lBQzFCLDRCQUE0QjtJQUM1QixtQkFBbUI7SUFDbkIsZUFBZTtJQUNmLG9CQUFvQjtJQUNwQixtQkFBbUI7SUFDbkIsYUFBYTtJQUNiLFlBQVk7SUFDWixvQkFBb0I7Q0FDckIsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUF3QixJQUFJLGNBQWMsRUFBTyxDQUFDO0FBRXhFLE1BQU0sT0FBTyxXQUFXO0NBQU07QUFFOUIsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0FBRTNELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBcUIsSUFBSSxXQUFXLEVBQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhcnNlciB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IE9iamVjdHMsIFR5cGVzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBRdWVyeUN1c3RvbVR5cGUgfSBmcm9tICcuLi9idWlsZGVyJztcbmltcG9ydCB7IG5vcm1hbGl6ZVZhbHVlIH0gZnJvbSAnLi4vYnVpbGRlcic7XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZSA9ICdhbGwnIHwgJ3JpZ2h0JyB8ICdsZWZ0JyB8ICdub25lJztcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJhYmxlIHtcbiAgcmVuZGVyKHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgICBwcmVmaXgsXG4gICAgcGFyc2VyLFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHBhcnNlcj86IFBhcnNlcjxhbnk+O1xuICB9KTogc3RyaW5nO1xuICB0b1N0cmluZygpOiBzdHJpbmc7XG4gIHRvSlNPTigpOiBhbnk7XG4gIGNsb25lKCk6IGFueTtcbn1cblxuZXhwb3J0IGNvbnN0IEZpZWxkRmFjdG9yeSA9IDxUIGV4dGVuZHMgb2JqZWN0PihuYW1lczogc3RyaW5nW10gPSBbXSk6IGFueSA9PlxuICBuZXcgUHJveHkoeyBfbmFtZXM6IG5hbWVzIH0gYXMgVCwge1xuICAgIGdldCh0YXJnZXQ6IFQsIGtleTogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgICBsZXQgbmFtZXMgPSAodGFyZ2V0IGFzIGFueSlbJ19uYW1lcyddO1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbmRlcicpIHtcbiAgICAgICAgcmV0dXJuICh7IHByZWZpeCB9OiB7IHByZWZpeD86IHN0cmluZyB9KSA9PlxuICAgICAgICAgIHByZWZpeCA/IGAke3ByZWZpeH0vJHtuYW1lcy5qb2luKCcvJyl9YCA6IG5hbWVzLmpvaW4oJy8nKTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnY2xvbmUnKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiBGaWVsZEZhY3RvcnkoWy4uLm5hbWVzXSk7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2lzRmllbGQnKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICd0b0pTT04nKSB7XG4gICAgICAgIHJldHVybiAoKSA9PiAoe1xuICAgICAgICAgICR0eXBlOiAnRmllbGQnLFxuICAgICAgICAgIG5hbWVzOiBuYW1lcyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3Jlc29sdmUnKSB7XG4gICAgICAgIHJldHVybiAocGFyc2VyOiBhbnkpID0+XG4gICAgICAgICAgbmFtZXMucmVkdWNlKChhY2M6IGFueSwgbmFtZTogc3RyaW5nKSA9PiBhY2MuZmllbGQobmFtZSksIHBhcnNlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gRmllbGRGYWN0b3J5KFsuLi5uYW1lcywga2V5XSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGhhcyh0YXJnZXQ6IFQsIGtleTogc3RyaW5nKTogYW55IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIFsndG9KU09OJywgJ2lzRmllbGQnLCAnY2xvbmUnLCAncmVuZGVyJywgJ3Jlc29sdmUnXS5pbmNsdWRlcyhrZXkpIHx8XG4gICAgICAgIGtleSBpbiB0YXJnZXRcbiAgICAgICk7XG4gICAgfSxcbiAgfSk7XG5cbmZ1bmN0aW9uIGFwcGx5TWl4aW5zKGRlcml2ZWRDdG9yOiBhbnksIGNvbnN0cnVjdG9yczogYW55W10pIHtcbiAgY29uc3RydWN0b3JzLmZvckVhY2goKGJhc2VDdG9yKSA9PiB7XG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYmFzZUN0b3IucHJvdG90eXBlKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgIGRlcml2ZWRDdG9yLnByb3RvdHlwZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlQ3Rvci5wcm90b3R5cGUsIG5hbWUpIHx8XG4gICAgICAgICAgT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyKFxuICB2YWx1ZTogYW55LFxuICB7XG4gICAgYWxpYXNlcyxcbiAgICBub3JtYWxpemUsXG4gICAgZXNjYXBlLFxuICAgIHByZWZpeCxcbiAgICBwYXJzZXIsXG4gIH06IHtcbiAgICBhbGlhc2VzPzogUXVlcnlDdXN0b21UeXBlW107XG4gICAgbm9ybWFsaXplPzogYm9vbGVhbjtcbiAgICBlc2NhcGU/OiBib29sZWFuO1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICBwYXJzZXI/OiBQYXJzZXI8YW55PjtcbiAgfSA9IHt9LFxuKTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwge1xuICBpZiAoVHlwZXMuaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICByZXR1cm4gcmVuZGVyKHZhbHVlKHN5bnRheCksIHsgYWxpYXNlcywgbm9ybWFsaXplLCBwcmVmaXgsIHBhcnNlciB9KTtcbiAgfVxuICBpZiAoVHlwZXMuaXNPYmplY3QodmFsdWUpICYmICdyZW5kZXInIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHJlbmRlcih2YWx1ZS5yZW5kZXIoeyBhbGlhc2VzLCBlc2NhcGUsIHByZWZpeCwgcGFyc2VyIH0pLCB7XG4gICAgICBhbGlhc2VzLFxuICAgICAgbm9ybWFsaXplLFxuICAgICAgZXNjYXBlLFxuICAgICAgcHJlZml4LFxuICAgICAgcGFyc2VyLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBub3JtYWxpemUgPyBub3JtYWxpemVWYWx1ZSh2YWx1ZSwgeyBhbGlhc2VzLCBlc2NhcGUgfSkgOiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUodmFsdWVzOiBhbnksIHBhcnNlcj86IFBhcnNlcjxhbnk+KSB7XG4gIGlmIChwYXJzZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIGxldCBmaWVsZHMgPSB2YWx1ZXMuZmlsdGVyKFxuICAgICAgKHY6IGFueSkgPT4gVHlwZXMuaXNPYmplY3QodikgJiYgJ2lzRmllbGQnIGluIHYgJiYgdi5pc0ZpZWxkKCksXG4gICAgKTtcbiAgICBpZiAoZmllbGRzLmxlbmd0aCA9PT0gMSAmJiBUeXBlcy5pc09iamVjdChwYXJzZXIpICYmICdmaWVsZCcgaW4gcGFyc2VyKSB7XG4gICAgICByZXR1cm4gZmllbGRzWzBdLnJlc29sdmUocGFyc2VyKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhcnNlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZSh2YWx1ZXM6IGFueSwgcGFyc2VyPzogUGFyc2VyPGFueT4pIHtcbiAgaWYgKHBhcnNlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHZhbHVlcy5tYXAoKHY6IGFueSkgPT5cbiAgICAgIFR5cGVzLmlzT2JqZWN0KHYpIHx8IHYgPT09IG51bGwgPyB2IDogcGFyc2VyPy5lbmNvZGUodiksXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb248VD4gaW1wbGVtZW50cyBSZW5kZXJhYmxlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgdmFsdWVzOiBhbnlbXSxcbiAgICBwcm90ZWN0ZWQgbm9ybWFsaXplOiBOb3JtYWxpemUsXG4gICAgcHJvdGVjdGVkIGVzY2FwZTogYm9vbGVhbiA9IGZhbHNlLFxuICApIHt9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnRnVuY3Rpb24nO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkdHlwZTogVHlwZXMucmF3VHlwZSh0aGlzKSxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHZhbHVlczogdGhpcy52YWx1ZXMubWFwKCh2KSA9PlxuICAgICAgICBUeXBlcy5pc09iamVjdCh2KSAmJiAndG9KU09OJyBpbiB2ID8gdi50b0pTT04oKSA6IHYsXG4gICAgICApLFxuICAgICAgbm9ybWFsaXplOiB0aGlzLm5vcm1hbGl6ZSxcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyKHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgICBwcmVmaXgsXG4gICAgcGFyc2VyLFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHBhcnNlcj86IFBhcnNlcjxUPjtcbiAgfSk6IHN0cmluZyB7XG4gICAgcGFyc2VyID0gcmVzb2x2ZSh0aGlzLnZhbHVlcywgcGFyc2VyKTtcbiAgICBsZXQgW2xlZnQsIC4uLnZhbHVlc10gPSBlbmNvZGUodGhpcy52YWx1ZXMsIHBhcnNlcik7XG5cbiAgICBsZWZ0ID0gcmVuZGVyKGxlZnQsIHtcbiAgICAgIGFsaWFzZXMsXG4gICAgICBlc2NhcGUsXG4gICAgICBwcmVmaXgsXG4gICAgICBwYXJzZXIsXG4gICAgICBub3JtYWxpemU6IHRoaXMubm9ybWFsaXplID09PSAnYWxsJyB8fCB0aGlzLm5vcm1hbGl6ZSA9PT0gJ2xlZnQnLFxuICAgIH0pO1xuICAgIGNvbnN0IHBhcmFtcyA9IFtcbiAgICAgIGxlZnQsXG4gICAgICAuLi52YWx1ZXMubWFwKCh2OiBhbnkpID0+XG4gICAgICAgIHJlbmRlcih2LCB7XG4gICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICBlc2NhcGUsXG4gICAgICAgICAgcHJlZml4LFxuICAgICAgICAgIHBhcnNlcixcbiAgICAgICAgICBub3JtYWxpemU6IHRoaXMubm9ybWFsaXplID09PSAnYWxsJyB8fCB0aGlzLm5vcm1hbGl6ZSA9PT0gJ3JpZ2h0JyxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgIF07XG4gICAgcmV0dXJuIGAke3RoaXMubmFtZX0oJHtwYXJhbXMuam9pbignLCAnKX0pYDtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oXG4gICAgICB0aGlzLm5hbWUsXG4gICAgICB0aGlzLnZhbHVlcy5tYXAoKHYpID0+IE9iamVjdHMuY2xvbmUodikpLFxuICAgICAgdGhpcy5ub3JtYWxpemUsXG4gICAgICB0aGlzLmVzY2FwZSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdHJpbmdBbmRDb2xsZWN0aW9uRnVuY3Rpb25zPFQ+IHtcbiAgY29uY2F0KGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignY29uY2F0JywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuXG4gIGNvbnRhaW5zKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignY29udGFpbnMnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG5cbiAgZW5kc1dpdGgobGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdlbmRzd2l0aCcsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICBpbmRleE9mKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignaW5kZXhvZicsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICBsZW5ndGgobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdsZW5ndGgnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICBzdGFydHNXaXRoKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignc3RhcnRzd2l0aCcsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cblxuICBzdWJTdHJpbmcoXG4gICAgbGVmdDogYW55LFxuICAgIHJpZ2h0OiBudW1iZXIsXG4gICAgbGVuZ3RoPzogbnVtYmVyLFxuICAgIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnLFxuICApIHtcbiAgICBsZXQgdmFsdWVzID0gW2xlZnQsIHJpZ2h0XTtcbiAgICBpZiAobGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlcy5wdXNoKGxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ3N1YnN0cmluZycsIHZhbHVlcywgbm9ybWFsaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkZ1bmN0aW9uczxUPiB7XG4gIGhhc1N1YnNldChsZWZ0OiBULCByaWdodDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2hhc3N1YnNldCcsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgaGFzU3Vic2VxdWVuY2UobGVmdDogVCwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdoYXNzdWJzZXF1ZW5jZScsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0cmluZ0Z1bmN0aW9uczxUPiB7XG4gIG1hdGNoZXNQYXR0ZXJuKFxuICAgIGxlZnQ6IGFueSB8IHN0cmluZyxcbiAgICBwYXR0ZXJuOiBzdHJpbmcsXG4gICAgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScsXG4gICkge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ21hdGNoZXNQYXR0ZXJuJywgW2xlZnQsIHBhdHRlcm5dLCBub3JtYWxpemUpO1xuICB9XG4gIHRvTG93ZXIobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ3RvbG93ZXInLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgdG9VcHBlcihsZWZ0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPigndG91cHBlcicsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxuICB0cmltKGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCd0cmltJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRlQW5kVGltZUZ1bmN0aW9uczxUPiB7XG4gIGRhdGUobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2RhdGUnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgZGF5KGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdkYXknLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgZnJhY3Rpb25hbHNlY29uZHMobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2ZyYWN0aW9uYWxzZWNvbmRzJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG4gIGhvdXIobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2hvdXInLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgbWF4ZGF0ZXRpbWUobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ21heGRhdGV0aW1lJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG4gIG1pbmRhdGV0aW1lKGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdtaW5kYXRldGltZScsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBtaW51dGUobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ21pbnV0ZScsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBtb250aChsZWZ0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignbW9udGgnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgbm93KCkge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ25vdycsIFtdLCAnbm9uZScpO1xuICB9XG4gIHNlY29uZChsZWZ0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignc2Vjb25kJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG4gIHRpbWUobGVmdDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdub25lJykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ3RpbWUnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgdG90YWxvZmZzZXRtaW51dGVzKGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCd0b3RhbG9mZnNldG1pbnV0ZXMnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgdG90YWxzZWNvbmRzKGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCd0b3RhbHNlY29uZHMnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgeWVhcihsZWZ0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPigneWVhcicsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXJpdGhtZXRpY0Z1bmN0aW9uczxUPiB7XG4gIGNlaWxpbmcobGVmdDogVCB8IHN0cmluZywgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdjZWlsaW5nJywgW2xlZnRdLCBub3JtYWxpemUpO1xuICB9XG4gIGZsb29yKGxlZnQ6IFQgfCBzdHJpbmcsIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignZmxvb3InLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgcm91bmQobGVmdDogVCB8IHN0cmluZywgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdyb3VuZCcsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHlwZUZ1bmN0aW9uczxUPiB7XG4gIGNhc3QobGVmdDogVCB8IHN0cmluZywgcmlnaHQ/OiBzdHJpbmcsIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2Nhc3QnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG5cbiAgaXNvZihsZWZ0OiBUIHwgc3RyaW5nLCByaWdodD86IHN0cmluZywgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignaXNvZicsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdlb0Z1bmN0aW9uczxUPiB7XG4gIGdlb0Rpc3RhbmNlKGxlZnQ6IFQsIHJpZ2h0OiBzdHJpbmcsIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb248VD4oJ2dlby5kaXN0YW5jZScsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgZ2VvSW50ZXJzZWN0cyhsZWZ0OiBULCByaWdodDogc3RyaW5nLCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uPFQ+KCdnZW8uaW50ZXJzZWN0cycsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgZ2VvTGVuZ3RoKGxlZnQ6IFQsIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignZ2VvLmxlbmd0aCcsIFtsZWZ0XSwgbm9ybWFsaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uYWxGdW5jdGlvbnM8VD4ge1xuICBjYXNlKGxlZnQ6IFQgfCBzdHJpbmcsIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ25vbmUnKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbjxUPignY2FzZScsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9wZXJhdG9yPFQ+IGltcGxlbWVudHMgUmVuZGVyYWJsZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBvcDogc3RyaW5nLFxuICAgIHByb3RlY3RlZCB2YWx1ZXM6IGFueVtdLFxuICAgIHByb3RlY3RlZCBub3JtYWxpemU6IE5vcm1hbGl6ZSxcbiAgKSB7fVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ09wZXJhdG9yJztcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHR5cGU6IFR5cGVzLnJhd1R5cGUodGhpcyksXG4gICAgICBvcDogdGhpcy5vcCxcbiAgICAgIHZhbHVlczogdGhpcy52YWx1ZXMubWFwKCh2KSA9PlxuICAgICAgICBUeXBlcy5pc09iamVjdCh2KSAmJiAndG9KU09OJyBpbiB2ID8gdi50b0pTT04oKSA6IHYsXG4gICAgICApLFxuICAgICAgbm9ybWFsaXplOiB0aGlzLm5vcm1hbGl6ZSxcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyKHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgICBwcmVmaXgsXG4gICAgcGFyc2VyLFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHBhcnNlcj86IFBhcnNlcjxUPjtcbiAgfSk6IHN0cmluZyB7XG4gICAgcGFyc2VyID0gcmVzb2x2ZSh0aGlzLnZhbHVlcywgcGFyc2VyKTtcbiAgICBsZXQgW2xlZnQsIHJpZ2h0XSA9IGVuY29kZSh0aGlzLnZhbHVlcywgcGFyc2VyKTtcblxuICAgIGxlZnQgPSByZW5kZXIobGVmdCwge1xuICAgICAgYWxpYXNlcyxcbiAgICAgIGVzY2FwZSxcbiAgICAgIHByZWZpeCxcbiAgICAgIHBhcnNlcixcbiAgICAgIG5vcm1hbGl6ZTogdGhpcy5ub3JtYWxpemUgPT09ICdhbGwnIHx8IHRoaXMubm9ybWFsaXplID09PSAnbGVmdCcsXG4gICAgfSk7XG4gICAgaWYgKHJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJpZ2h0ID0gQXJyYXkuaXNBcnJheShyaWdodClcbiAgICAgICAgPyBgKCR7cmlnaHRcbiAgICAgICAgICAgIC5tYXAoKHYpID0+XG4gICAgICAgICAgICAgIHJlbmRlcih2LCB7XG4gICAgICAgICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICAgICAgICBlc2NhcGUsXG4gICAgICAgICAgICAgICAgcHJlZml4LFxuICAgICAgICAgICAgICAgIHBhcnNlcixcbiAgICAgICAgICAgICAgICBub3JtYWxpemU6XG4gICAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZSA9PT0gJ2FsbCcgfHwgdGhpcy5ub3JtYWxpemUgPT09ICdyaWdodCcsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpvaW4oJywnKX0pYFxuICAgICAgICA6IHJlbmRlcihyaWdodCwge1xuICAgICAgICAgICAgYWxpYXNlcyxcbiAgICAgICAgICAgIGVzY2FwZSxcbiAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgIHBhcnNlcixcbiAgICAgICAgICAgIG5vcm1hbGl6ZTogdGhpcy5ub3JtYWxpemUgPT09ICdhbGwnIHx8IHRoaXMubm9ybWFsaXplID09PSAncmlnaHQnLFxuICAgICAgICAgIH0pO1xuICAgICAgcmV0dXJuIGAke2xlZnR9ICR7dGhpcy5vcH0gJHtyaWdodH1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5vcH0oJHtsZWZ0fSlgO1xuICB9XG5cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcihcbiAgICAgIHRoaXMub3AsXG4gICAgICB0aGlzLnZhbHVlcy5tYXAoKHYpID0+IE9iamVjdHMuY2xvbmUodikpLFxuICAgICAgdGhpcy5ub3JtYWxpemUsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTG9naWNhbE9wZXJhdG9yczxUPiB7XG4gIGVxKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignZXEnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIG5lKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignbmUnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIGd0KGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignZ3QnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIGdlKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignZ2UnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIGx0KGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignbHQnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIGxlKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignbGUnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIC8qXG4gIGFuZChsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ2FuZCcsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgb3IobGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IE9wZXJhdG9yKCdvcicsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgKi9cbiAgbm90KGxlZnQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAnbm9uZScpIHtcbiAgICByZXR1cm4gbmV3IE9wZXJhdG9yPFQ+KCdub3QnLCBbbGVmdF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgaGFzKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignaGFzJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBpbihsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ2luJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXJpdGhtZXRpY09wZXJhdG9yczxUPiB7XG4gIGFkZChsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3I8VD4oJ2FkZCcsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgc3ViKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignc3ViJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBtdWwobGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU6IE5vcm1hbGl6ZSA9ICdyaWdodCcpIHtcbiAgICByZXR1cm4gbmV3IE9wZXJhdG9yKCdtdWwnLCBbbGVmdCwgcmlnaHRdLCBub3JtYWxpemUpO1xuICB9XG4gIGRpdihsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZTogTm9ybWFsaXplID0gJ3JpZ2h0Jykge1xuICAgIHJldHVybiBuZXcgT3BlcmF0b3IoJ2RpdicsIFtsZWZ0LCByaWdodF0sIG5vcm1hbGl6ZSk7XG4gIH1cbiAgbW9kKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignbW9kJywgW2xlZnQsIHJpZ2h0XSwgbm9ybWFsaXplKTtcbiAgfVxuICBuZWcodmFsdWU6IGFueSwgbm9ybWFsaXplOiBOb3JtYWxpemUgPSAncmlnaHQnKSB7XG4gICAgcmV0dXJuIG5ldyBPcGVyYXRvcignLScsIFt2YWx1ZV0sIG5vcm1hbGl6ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdyb3VwaW5nPFQ+IGltcGxlbWVudHMgUmVuZGVyYWJsZSB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBncm91cDogUmVuZGVyYWJsZSkge31cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdHcm91cGluZyc7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICR0eXBlOiBUeXBlcy5yYXdUeXBlKHRoaXMpLFxuICAgICAgZ3JvdXA6IHRoaXMuZ3JvdXAudG9KU09OKCksXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7XG4gICAgYWxpYXNlcyxcbiAgICBlc2NhcGUsXG4gICAgcHJlZml4LFxuICAgIHBhcnNlcixcbiAgfToge1xuICAgIGFsaWFzZXM/OiBRdWVyeUN1c3RvbVR5cGVbXTtcbiAgICBlc2NhcGU/OiBib29sZWFuO1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICBwYXJzZXI/OiBQYXJzZXI8VD47XG4gIH0pOiBzdHJpbmcge1xuICAgIHJldHVybiBgKCR7cmVuZGVyKHRoaXMuZ3JvdXAsIHsgYWxpYXNlcywgZXNjYXBlLCBwcmVmaXgsIHBhcnNlciB9KX0pYDtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgR3JvdXBpbmcoT2JqZWN0cy5jbG9uZSh0aGlzLmdyb3VwKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExhbWJkYTxUPiBpbXBsZW1lbnRzIFJlbmRlcmFibGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgb3A6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgdmFsdWVzOiBhbnlbXSxcbiAgICBwcm90ZWN0ZWQgYWxpYXM/OiBzdHJpbmcsXG4gICkge31cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdMYW1iZGEnO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkdHlwZTogVHlwZXMucmF3VHlwZSh0aGlzKSxcbiAgICAgIG9wOiB0aGlzLm9wLFxuICAgICAgdmFsdWVzOiB0aGlzLnZhbHVlcy5tYXAoKHYpID0+XG4gICAgICAgIFR5cGVzLmlzT2JqZWN0KHYpICYmICd0b0pTT04nIGluIHYgPyB2LnRvSlNPTigpIDogdixcbiAgICAgICksXG4gICAgICBhbGlhczogdGhpcy5hbGlhcyxcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyKHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgICBwcmVmaXgsXG4gICAgcGFyc2VyLFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIHBhcnNlcj86IFBhcnNlcjxUPjtcbiAgfSk6IHN0cmluZyB7XG4gICAgcGFyc2VyID0gcmVzb2x2ZSh0aGlzLnZhbHVlcywgcGFyc2VyKTtcbiAgICBsZXQgW2xlZnQsIHJpZ2h0XSA9IGVuY29kZSh0aGlzLnZhbHVlcywgcGFyc2VyKTtcblxuICAgIGxlZnQgPSByZW5kZXIobGVmdCwgeyBhbGlhc2VzLCBlc2NhcGUsIHByZWZpeCwgcGFyc2VyIH0pO1xuICAgIGlmIChyaWdodCkge1xuICAgICAgbGV0IGFsaWFzID0gdGhpcy5hbGlhcyB8fCBsZWZ0LnNwbGl0KCcvJykucG9wKCkudG9Mb3dlckNhc2UoKVswXTtcbiAgICAgIHJldHVybiBgJHtsZWZ0fS8ke3RoaXMub3B9KCR7YWxpYXN9OiR7cmVuZGVyKHJpZ2h0LCB7XG4gICAgICAgIGFsaWFzZXMsXG4gICAgICAgIGVzY2FwZSxcbiAgICAgICAgcHJlZml4OiBhbGlhcyxcbiAgICAgICAgcGFyc2VyLFxuICAgICAgfSl9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHtsZWZ0fS8ke3RoaXMub3B9KClgO1xuICAgIH1cbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgTGFtYmRhKFxuICAgICAgdGhpcy5vcCxcbiAgICAgIHRoaXMudmFsdWVzLm1hcCgodikgPT4gT2JqZWN0cy5jbG9uZSh2KSksXG4gICAgICB0aGlzLmFsaWFzLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExhbWJkYU9wZXJhdG9yczxUPiB7XG4gIGFueShsZWZ0OiBULCByaWdodDogYW55LCBhbGlhcz86IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgTGFtYmRhKCdhbnknLCBbbGVmdCwgcmlnaHRdLCBhbGlhcyk7XG4gIH1cblxuICBhbGwobGVmdDogVCwgcmlnaHQ6IGFueSwgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYSgnYWxsJywgW2xlZnQsIHJpZ2h0XSwgYWxpYXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YU9wZXJhdG9yczxUPiB7fVxuZXhwb3J0IGludGVyZmFjZSBPRGF0YU9wZXJhdG9yczxUPlxuICBleHRlbmRzIExvZ2ljYWxPcGVyYXRvcnM8VD4sXG4gICAgQXJpdGhtZXRpY09wZXJhdG9yczxUPixcbiAgICBMYW1iZGFPcGVyYXRvcnM8VD4ge31cblxuYXBwbHlNaXhpbnMoT0RhdGFPcGVyYXRvcnMsIFtcbiAgTG9naWNhbE9wZXJhdG9ycyxcbiAgQXJpdGhtZXRpY09wZXJhdG9ycyxcbiAgTGFtYmRhT3BlcmF0b3JzLFxuXSk7XG5leHBvcnQgY29uc3Qgb3BlcmF0b3JzOiBPRGF0YU9wZXJhdG9yczxhbnk+ID0gbmV3IE9EYXRhT3BlcmF0b3JzPGFueT4oKTtcblxuZXhwb3J0IGNsYXNzIE9EYXRhRnVuY3Rpb25zPFQ+IHt9XG5leHBvcnQgaW50ZXJmYWNlIE9EYXRhRnVuY3Rpb25zPFQ+XG4gIGV4dGVuZHMgU3RyaW5nQW5kQ29sbGVjdGlvbkZ1bmN0aW9uczxUPixcbiAgICBDb2xsZWN0aW9uRnVuY3Rpb25zPFQ+LFxuICAgIFN0cmluZ0Z1bmN0aW9uczxUPixcbiAgICBEYXRlQW5kVGltZUZ1bmN0aW9uczxUPixcbiAgICBBcml0aG1ldGljRnVuY3Rpb25zPFQ+LFxuICAgIFR5cGVGdW5jdGlvbnM8VD4sXG4gICAgR2VvRnVuY3Rpb25zPFQ+LFxuICAgIENvbmRpdGlvbmFsRnVuY3Rpb25zPFQ+IHt9XG5cbmFwcGx5TWl4aW5zKE9EYXRhRnVuY3Rpb25zLCBbXG4gIFN0cmluZ0FuZENvbGxlY3Rpb25GdW5jdGlvbnMsXG4gIENvbGxlY3Rpb25GdW5jdGlvbnMsXG4gIFN0cmluZ0Z1bmN0aW9ucyxcbiAgRGF0ZUFuZFRpbWVGdW5jdGlvbnMsXG4gIEFyaXRobWV0aWNGdW5jdGlvbnMsXG4gIFR5cGVGdW5jdGlvbnMsXG4gIEdlb0Z1bmN0aW9ucyxcbiAgQ29uZGl0aW9uYWxGdW5jdGlvbnMsXG5dKTtcbmV4cG9ydCBjb25zdCBmdW5jdGlvbnM6IE9EYXRhRnVuY3Rpb25zPGFueT4gPSBuZXcgT0RhdGFGdW5jdGlvbnM8YW55PigpO1xuXG5leHBvcnQgY2xhc3MgT0RhdGFTeW50YXg8VD4ge31cbmV4cG9ydCBpbnRlcmZhY2UgT0RhdGFTeW50YXg8VD4gZXh0ZW5kcyBPRGF0YU9wZXJhdG9yczxUPiwgT0RhdGFGdW5jdGlvbnM8VD4ge31cbmFwcGx5TWl4aW5zKE9EYXRhU3ludGF4LCBbT0RhdGFPcGVyYXRvcnMsIE9EYXRhRnVuY3Rpb25zXSk7XG5cbmV4cG9ydCBjb25zdCBzeW50YXg6IE9EYXRhU3ludGF4PGFueT4gPSBuZXcgT0RhdGFTeW50YXg8YW55PigpO1xuIl19
|