angular-odata 0.95.0 → 0.99.5
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 +31 -25
- package/esm2020/lib/cache/cache.mjs +2 -2
- package/esm2020/lib/client.mjs +3 -3
- package/esm2020/lib/models/collection.mjs +53 -48
- package/esm2020/lib/models/model.mjs +33 -37
- package/esm2020/lib/models/options.mjs +35 -14
- package/esm2020/lib/module.mjs +4 -4
- package/esm2020/lib/resources/query/builder.mjs +2 -1
- package/esm2020/lib/resources/query/expressions/base.mjs +20 -0
- package/esm2020/lib/resources/query/expressions/compute.mjs +45 -0
- package/esm2020/lib/resources/query/expressions/expand.mjs +121 -0
- package/esm2020/lib/resources/query/expressions/filter.mjs +160 -0
- package/esm2020/lib/resources/query/expressions/index.mjs +7 -0
- package/esm2020/lib/resources/query/expressions/orderby.mjs +62 -0
- package/esm2020/lib/resources/query/expressions/search.mjs +125 -0
- package/esm2020/lib/resources/query/expressions/select.mjs +37 -0
- package/esm2020/lib/resources/query/expressions/syntax.mjs +404 -0
- package/esm2020/lib/resources/query/handlers.mjs +22 -20
- package/esm2020/lib/resources/query/options.mjs +34 -37
- package/esm2020/lib/resources/resource.mjs +6 -14
- package/esm2020/lib/resources/types/action.mjs +4 -1
- package/esm2020/lib/resources/types/batch.mjs +36 -10
- package/esm2020/lib/resources/types/count.mjs +4 -1
- package/esm2020/lib/resources/types/entity-set.mjs +4 -1
- package/esm2020/lib/resources/types/entity.mjs +6 -3
- package/esm2020/lib/resources/types/function.mjs +4 -1
- package/esm2020/lib/resources/types/media.mjs +4 -1
- package/esm2020/lib/resources/types/metadata.mjs +4 -1
- package/esm2020/lib/resources/types/navigation-property.mjs +4 -1
- package/esm2020/lib/resources/types/property.mjs +4 -1
- package/esm2020/lib/resources/types/reference.mjs +4 -1
- package/esm2020/lib/resources/types/singleton.mjs +4 -1
- package/esm2020/lib/resources/types/value.mjs +4 -1
- package/esm2020/lib/schema/element.mjs +12 -2
- package/esm2020/lib/schema/enum-type.mjs +9 -1
- package/esm2020/lib/schema/structured-type.mjs +11 -2
- package/esm2020/lib/services/entity-set.mjs +6 -6
- package/esm2020/lib/services/factory.mjs +3 -3
- package/esm2020/lib/types.mjs +2 -1
- package/esm2020/lib/utils/objects.mjs +5 -1
- package/fesm2015/angular-odata.mjs +751 -297
- package/fesm2015/angular-odata.mjs.map +1 -1
- package/fesm2020/angular-odata.mjs +750 -301
- package/fesm2020/angular-odata.mjs.map +1 -1
- package/lib/models/collection.d.ts +4 -2
- package/lib/models/model.d.ts +1 -1
- package/lib/models/options.d.ts +12 -10
- package/lib/resources/query/builder.d.ts +1 -0
- package/lib/resources/query/expressions/base.d.ts +20 -0
- package/lib/resources/query/expressions/compute.d.ts +27 -0
- package/lib/resources/query/expressions/expand.d.ts +68 -0
- package/lib/resources/query/expressions/filter.d.ts +59 -0
- package/lib/resources/query/expressions/index.d.ts +6 -0
- package/lib/resources/query/expressions/orderby.d.ts +39 -0
- package/lib/resources/query/expressions/search.d.ts +50 -0
- package/lib/resources/query/expressions/select.d.ts +22 -0
- package/lib/resources/query/{syntax.d.ts → expressions/syntax.d.ts} +21 -9
- package/lib/resources/query/handlers.d.ts +27 -12
- package/lib/resources/query/options.d.ts +10 -8
- package/lib/resources/resource.d.ts +2 -1
- package/lib/resources/types/action.d.ts +1 -0
- package/lib/resources/types/batch.d.ts +10 -0
- package/lib/resources/types/count.d.ts +1 -0
- package/lib/resources/types/entity-set.d.ts +1 -0
- package/lib/resources/types/entity.d.ts +1 -0
- package/lib/resources/types/function.d.ts +1 -0
- package/lib/resources/types/media.d.ts +1 -0
- package/lib/resources/types/metadata.d.ts +1 -0
- package/lib/resources/types/navigation-property.d.ts +1 -0
- package/lib/resources/types/property.d.ts +1 -0
- package/lib/resources/types/reference.d.ts +1 -0
- package/lib/resources/types/singleton.d.ts +1 -0
- package/lib/resources/types/value.d.ts +1 -0
- package/lib/schema/element.d.ts +7 -1
- package/lib/schema/enum-type.d.ts +6 -0
- package/lib/schema/structured-type.d.ts +7 -1
- package/lib/types.d.ts +1 -0
- package/package.json +1 -1
- package/esm2020/lib/resources/query/expressions.mjs +0 -207
- package/esm2020/lib/resources/query/syntax.mjs +0 -406
- package/lib/resources/query/expressions.d.ts +0 -63
|
@@ -17,6 +17,7 @@ export declare class ODataEntitySetResource<T> extends ODataResource<T> {
|
|
|
17
17
|
schema?: ODataStructuredType<E>;
|
|
18
18
|
query?: ODataQueryOptions<E>;
|
|
19
19
|
}): ODataEntitySetResource<E>;
|
|
20
|
+
clone(): ODataEntitySetResource<T>;
|
|
20
21
|
entity(key?: any): ODataEntityResource<T>;
|
|
21
22
|
action<P, R>(path: string): ODataActionResource<P, R>;
|
|
22
23
|
function<P, R>(path: string): ODataFunctionResource<P, R>;
|
|
@@ -19,6 +19,7 @@ export declare class ODataEntityResource<T> extends ODataResource<T> {
|
|
|
19
19
|
segments: ODataPathSegments;
|
|
20
20
|
query?: ODataQueryOptions<E>;
|
|
21
21
|
}): ODataEntityResource<E>;
|
|
22
|
+
clone(): ODataEntityResource<T>;
|
|
22
23
|
key(value: any): ODataEntityResource<T>;
|
|
23
24
|
keys(values: any[]): ODataEntityResource<T>;
|
|
24
25
|
media(): ODataMediaResource;
|
|
@@ -16,6 +16,7 @@ export declare class ODataFunctionResource<P, R> extends ODataResource<R> {
|
|
|
16
16
|
query?: ODataQueryOptions<R>;
|
|
17
17
|
}): ODataFunctionResource<P, R>;
|
|
18
18
|
static fromResource<P, R>(resource: ODataResource<any>, path: string): ODataFunctionResource<P, R>;
|
|
19
|
+
clone(): ODataFunctionResource<P, R>;
|
|
19
20
|
returnType(): string | undefined;
|
|
20
21
|
parameters(params: P | null, { alias }?: {
|
|
21
22
|
alias?: boolean;
|
|
@@ -9,6 +9,7 @@ export declare class ODataMediaResource extends ODataResource<any> {
|
|
|
9
9
|
segments: ODataPathSegments;
|
|
10
10
|
query?: ODataQueryOptions<V>;
|
|
11
11
|
}): ODataMediaResource;
|
|
12
|
+
clone(): ODataMediaResource;
|
|
12
13
|
protected get(options: {
|
|
13
14
|
responseType: any;
|
|
14
15
|
} & ODataOptions): Observable<any>;
|
|
@@ -7,6 +7,7 @@ import { ODataOptions } from './options';
|
|
|
7
7
|
export declare class ODataMetadataResource extends ODataResource<any> {
|
|
8
8
|
constructor(api: ODataApi, segments?: ODataPathSegments);
|
|
9
9
|
static factory(api: ODataApi): ODataMetadataResource;
|
|
10
|
+
clone(): ODataMetadataResource;
|
|
10
11
|
protected get(options?: ODataOptions): Observable<ODataMetadata>;
|
|
11
12
|
fetch(options?: ODataOptions): Observable<ODataMetadata>;
|
|
12
13
|
}
|
|
@@ -26,6 +26,7 @@ export declare class ODataNavigationPropertyResource<T> extends ODataResource<T>
|
|
|
26
26
|
query?: ODataQueryOptions<N>;
|
|
27
27
|
}): ODataNavigationPropertyResource<N>;
|
|
28
28
|
static fromResource<N>(resource: ODataResource<any>, path: string): ODataNavigationPropertyResource<N>;
|
|
29
|
+
clone(): ODataNavigationPropertyResource<T>;
|
|
29
30
|
key(value: any): ODataNavigationPropertyResource<T>;
|
|
30
31
|
keys(values: any[]): ODataNavigationPropertyResource<T>;
|
|
31
32
|
media(): ODataMediaResource;
|
|
@@ -17,6 +17,7 @@ export declare class ODataPropertyResource<T> extends ODataResource<T> {
|
|
|
17
17
|
query?: ODataQueryOptions<P>;
|
|
18
18
|
}): ODataPropertyResource<P>;
|
|
19
19
|
static fromResource<N>(resource: ODataResource<any>, path: string): ODataPropertyResource<N>;
|
|
20
|
+
clone(): ODataPropertyResource<T>;
|
|
20
21
|
key(value: any): ODataPropertyResource<T>;
|
|
21
22
|
keys(values: any[]): ODataPropertyResource<T>;
|
|
22
23
|
value(): ODataValueResource<T>;
|
|
@@ -12,6 +12,7 @@ export declare class ODataReferenceResource<T> extends ODataResource<T> {
|
|
|
12
12
|
segments: ODataPathSegments;
|
|
13
13
|
query?: ODataQueryOptions<P>;
|
|
14
14
|
}): ODataReferenceResource<P>;
|
|
15
|
+
clone(): ODataReferenceResource<T>;
|
|
15
16
|
protected post(target: ODataEntityResource<any>, options?: ODataOptions): Observable<any>;
|
|
16
17
|
protected put(target: ODataEntityResource<any>, options?: ODataOptions & {
|
|
17
18
|
etag?: string;
|
|
@@ -17,6 +17,7 @@ export declare class ODataSingletonResource<T> extends ODataResource<T> {
|
|
|
17
17
|
schema?: ODataStructuredType<S>;
|
|
18
18
|
query?: ODataQueryOptions<S>;
|
|
19
19
|
}): ODataSingletonResource<S>;
|
|
20
|
+
clone(): ODataSingletonResource<T>;
|
|
20
21
|
key(value: any): ODataSingletonResource<T>;
|
|
21
22
|
keys(values: any[]): ODataSingletonResource<T>;
|
|
22
23
|
navigationProperty<N>(path: string): ODataNavigationPropertyResource<N>;
|
|
@@ -12,6 +12,7 @@ export declare class ODataValueResource<T> extends ODataResource<T> {
|
|
|
12
12
|
segments: ODataPathSegments;
|
|
13
13
|
query?: ODataQueryOptions<V>;
|
|
14
14
|
}): ODataValueResource<V>;
|
|
15
|
+
clone(): ODataValueResource<T>;
|
|
15
16
|
protected get(options?: ODataOptions): Observable<T>;
|
|
16
17
|
/**
|
|
17
18
|
* Fetch the value of the resource.
|
package/lib/schema/element.d.ts
CHANGED
|
@@ -31,9 +31,15 @@ export declare class ODataSchemaElement extends ODataAnnotatable {
|
|
|
31
31
|
*/
|
|
32
32
|
isTypeOf(type: string): boolean;
|
|
33
33
|
/**
|
|
34
|
-
* Returns a boolean indicating if the structured type is a
|
|
34
|
+
* Returns a boolean indicating if the structured type is a subtype of the given type.
|
|
35
35
|
* @param type String representation of the type
|
|
36
36
|
* @returns True if the callable is type of the given type
|
|
37
37
|
*/
|
|
38
38
|
isSubtypeOf(schema: ODataSchemaElement): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Returns a boolean indicating if the structured type is a supertype of the given type.
|
|
41
|
+
* @param type String representation of the type
|
|
42
|
+
* @returns True if the callable is type of the given type
|
|
43
|
+
*/
|
|
44
|
+
isSupertypeOf(schema: ODataSchemaElement): boolean;
|
|
39
45
|
}
|
|
@@ -28,6 +28,12 @@ export declare class ODataEnumType<E> extends ODataSchemaElement {
|
|
|
28
28
|
* @returns The field with the given value
|
|
29
29
|
*/
|
|
30
30
|
findFieldByValue(value: number): ODataEnumTypeFieldParser | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Find a fields by flag.
|
|
33
|
+
* @param value The value of the field
|
|
34
|
+
* @returns The fields with the given flag
|
|
35
|
+
*/
|
|
36
|
+
findFieldsByValue(value: number): ODataEnumTypeFieldParser[];
|
|
31
37
|
/**
|
|
32
38
|
* Map the fields of the enum type.
|
|
33
39
|
* @param mapper Function that maps the value to the new value
|
|
@@ -18,11 +18,17 @@ export declare class ODataStructuredType<T> extends ODataSchemaElement {
|
|
|
18
18
|
findOptionsForType: (type: string) => any;
|
|
19
19
|
}): void;
|
|
20
20
|
/**
|
|
21
|
-
* Returns a boolean indicating if the structured type is a
|
|
21
|
+
* Returns a boolean indicating if the structured type is a subtype of the given type.
|
|
22
22
|
* @param type String representation of the type
|
|
23
23
|
* @returns True if the callable is type of the given type
|
|
24
24
|
*/
|
|
25
25
|
isSubtypeOf(schema: ODataStructuredType<any>): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Returns a boolean indicating if the structured type is a supertype of the given type.
|
|
28
|
+
* @param type String representation of the type
|
|
29
|
+
* @returns True if the callable is type of the given type
|
|
30
|
+
*/
|
|
31
|
+
isSupertypeOf(schema: ODataStructuredType<any>): boolean;
|
|
26
32
|
/**
|
|
27
33
|
* Returns a boolean indicating if the structured type has a simple key.
|
|
28
34
|
* @returns True if the structured type has a simple key
|
package/lib/types.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { Field, functions, operators, } from './syntax';
|
|
2
|
-
import { syntax } from './syntax';
|
|
3
|
-
export class Expression {
|
|
4
|
-
constructor({ children, connector, negated, } = {}) {
|
|
5
|
-
this._children = children || [];
|
|
6
|
-
this._connector = connector || 'and';
|
|
7
|
-
this._negated = negated || false;
|
|
8
|
-
}
|
|
9
|
-
get [Symbol.toStringTag]() {
|
|
10
|
-
return 'Expression';
|
|
11
|
-
}
|
|
12
|
-
static s() {
|
|
13
|
-
return Field.factory();
|
|
14
|
-
}
|
|
15
|
-
static e(connector = 'and') {
|
|
16
|
-
return new Expression({ connector });
|
|
17
|
-
}
|
|
18
|
-
static o() {
|
|
19
|
-
return operators;
|
|
20
|
-
}
|
|
21
|
-
static f() {
|
|
22
|
-
return functions;
|
|
23
|
-
}
|
|
24
|
-
static filter(opts) {
|
|
25
|
-
return opts({
|
|
26
|
-
s: Expression.s(),
|
|
27
|
-
e: Expression.e,
|
|
28
|
-
o: Expression.o(),
|
|
29
|
-
f: Expression.f(),
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
toJSON() {
|
|
33
|
-
return {
|
|
34
|
-
children: this._children.map((c) => c.toJSON()),
|
|
35
|
-
connector: this._connector,
|
|
36
|
-
negated: this._negated,
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
children() {
|
|
40
|
-
return this._children;
|
|
41
|
-
}
|
|
42
|
-
connector() {
|
|
43
|
-
return this._connector;
|
|
44
|
-
}
|
|
45
|
-
negated() {
|
|
46
|
-
return this._negated;
|
|
47
|
-
}
|
|
48
|
-
length() {
|
|
49
|
-
return this._children.length;
|
|
50
|
-
}
|
|
51
|
-
render({ aliases, escape, prefix, } = {}) {
|
|
52
|
-
let content = this._children
|
|
53
|
-
.map((n) => n.render({ aliases, escape, prefix }))
|
|
54
|
-
.join(` ${this._connector} `);
|
|
55
|
-
if (this._negated) {
|
|
56
|
-
content = `not (${content})`;
|
|
57
|
-
}
|
|
58
|
-
return content;
|
|
59
|
-
}
|
|
60
|
-
_add(node, connector) {
|
|
61
|
-
if (connector !== undefined && this._connector !== connector) {
|
|
62
|
-
let children = [];
|
|
63
|
-
if (this._children.length > 0) {
|
|
64
|
-
if (this._children.length === 1) {
|
|
65
|
-
children = [...this._children];
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
let exp = new Expression({
|
|
69
|
-
children: this._children,
|
|
70
|
-
connector: this._connector,
|
|
71
|
-
negated: this._negated,
|
|
72
|
-
});
|
|
73
|
-
if (exp.length() > 1) {
|
|
74
|
-
children.push(syntax.grouping(exp));
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
children.push(exp);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
if (node instanceof Expression &&
|
|
82
|
-
(node.connector() === connector || node.length() === 1)) {
|
|
83
|
-
children = [...children, ...node.children()];
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
children.push(syntax.grouping(node));
|
|
87
|
-
}
|
|
88
|
-
this._connector = connector;
|
|
89
|
-
this._children = children;
|
|
90
|
-
}
|
|
91
|
-
else if (node instanceof Expression &&
|
|
92
|
-
!node.negated() &&
|
|
93
|
-
(node.connector() === connector || node.length() === 1)) {
|
|
94
|
-
this._children = [...this._children, ...node.children()];
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
this._children.push(node instanceof Expression && !node.negated()
|
|
98
|
-
? syntax.grouping(node)
|
|
99
|
-
: node);
|
|
100
|
-
}
|
|
101
|
-
return this;
|
|
102
|
-
}
|
|
103
|
-
or(exp) {
|
|
104
|
-
return this._add(exp, 'or');
|
|
105
|
-
}
|
|
106
|
-
and(exp) {
|
|
107
|
-
return this._add(exp, 'and');
|
|
108
|
-
}
|
|
109
|
-
not(exp) {
|
|
110
|
-
const notExp = new Expression({
|
|
111
|
-
children: exp.children(),
|
|
112
|
-
connector: exp.connector(),
|
|
113
|
-
negated: true,
|
|
114
|
-
});
|
|
115
|
-
return this._add(notExp, this._connector);
|
|
116
|
-
}
|
|
117
|
-
eq(left, right, normalize) {
|
|
118
|
-
return this._add(operators.eq(left, right, normalize));
|
|
119
|
-
}
|
|
120
|
-
ne(left, right, normalize) {
|
|
121
|
-
return this._add(operators.ne(left, right, normalize));
|
|
122
|
-
}
|
|
123
|
-
gt(left, right, normalize) {
|
|
124
|
-
return this._add(operators.gt(left, right, normalize));
|
|
125
|
-
}
|
|
126
|
-
ge(left, right, normalize) {
|
|
127
|
-
return this._add(operators.ge(left, right, normalize));
|
|
128
|
-
}
|
|
129
|
-
lt(left, right, normalize) {
|
|
130
|
-
return this._add(operators.lt(left, right, normalize));
|
|
131
|
-
}
|
|
132
|
-
le(left, right, normalize) {
|
|
133
|
-
return this._add(operators.le(left, right, normalize));
|
|
134
|
-
}
|
|
135
|
-
has(left, right, normalize) {
|
|
136
|
-
return this._add(operators.has(left, right, normalize));
|
|
137
|
-
}
|
|
138
|
-
in(left, right, normalize) {
|
|
139
|
-
return this._add(operators.in(left, right, normalize));
|
|
140
|
-
}
|
|
141
|
-
contains(left, right, normalize) {
|
|
142
|
-
return this._add(functions.contains(left, right, normalize));
|
|
143
|
-
}
|
|
144
|
-
startsWith(left, right, normalize) {
|
|
145
|
-
return this._add(functions.startsWith(left, right, normalize));
|
|
146
|
-
}
|
|
147
|
-
endsWith(left, right, normalize) {
|
|
148
|
-
return this._add(functions.endsWith(left, right, normalize));
|
|
149
|
-
}
|
|
150
|
-
any(left, opts, alias) {
|
|
151
|
-
const exp = opts({
|
|
152
|
-
s: Field.factory(),
|
|
153
|
-
e: Expression.e,
|
|
154
|
-
});
|
|
155
|
-
return this._add(syntax.any(left, exp, alias));
|
|
156
|
-
}
|
|
157
|
-
all(left, opts, alias) {
|
|
158
|
-
const exp = opts({
|
|
159
|
-
s: Field.factory(),
|
|
160
|
-
e: Expression.e,
|
|
161
|
-
});
|
|
162
|
-
return this._add(syntax.all(left, exp, alias));
|
|
163
|
-
}
|
|
164
|
-
isof(left, type) {
|
|
165
|
-
return this._add(syntax.isof(left, type));
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
/*
|
|
169
|
-
export class FilterExpression<T> extends Expression<T> {
|
|
170
|
-
constructor({
|
|
171
|
-
children,
|
|
172
|
-
connector,
|
|
173
|
-
negated,
|
|
174
|
-
}: {
|
|
175
|
-
children?: Renderable[];
|
|
176
|
-
connector?: Connector;
|
|
177
|
-
negated?: boolean;
|
|
178
|
-
} = {}) {
|
|
179
|
-
super({ children, connector, negated });
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
get [Symbol.toStringTag]() {
|
|
183
|
-
return 'FilterExpression';
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
static e<T>() {
|
|
187
|
-
return new FilterExpression<T>({ connector: Connector.AND });
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
static and<T>() {
|
|
191
|
-
return new FilterExpression<T>({ connector: Connector.AND });
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
static or<T>() {
|
|
195
|
-
return new FilterExpression<T>({ connector: Connector.OR });
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
static not<T>(exp: FilterExpression<T>) {
|
|
199
|
-
return new FilterExpression<T>({
|
|
200
|
-
children: exp.children(),
|
|
201
|
-
connector: exp.connector(),
|
|
202
|
-
negated: true,
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
*/
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3F1ZXJ5L2V4cHJlc3Npb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxLQUFLLEVBQ0wsU0FBUyxFQUdULFNBQVMsR0FFVixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSWxDLE1BQU0sT0FBTyxVQUFVO0lBSXJCLFlBQVksRUFDVixRQUFRLEVBQ1IsU0FBUyxFQUNULE9BQU8sTUFLTCxFQUFFO1FBQ0osSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3RCLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxNQUFNLENBQUMsQ0FBQztRQUNOLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBSyxDQUFDO0lBQzVCLENBQUM7SUFFRCxNQUFNLENBQUMsQ0FBQyxDQUFJLFlBQXVCLEtBQUs7UUFDdEMsT0FBTyxJQUFJLFVBQVUsQ0FBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELE1BQU0sQ0FBQyxDQUFDO1FBQ04sT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sQ0FBQyxDQUFDO1FBQ04sT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQ1gsSUFLbUI7UUFFbkIsT0FBTyxJQUFJLENBQUM7WUFDVixDQUFDLEVBQUUsVUFBVSxDQUFD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Q0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsRUFBRSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsU0FBbUI7UUFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxFQUFFLENBQUMsSUFBUyxFQUFFLEtBQVUsRUFBRSxTQUFtQjtRQUMzQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFNBQW1CO1FBQzNDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsRUFBRSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsU0FBbUI7UUFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxFQUFFLENBQUMsSUFBUyxFQUFFLEtBQVUsRUFBRSxTQUFtQjtRQUMzQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFNBQW1CO1FBQzNDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsR0FBRyxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsU0FBbUI7UUFDNUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxFQUFFLENBQUMsSUFBUyxFQUFFLEtBQVUsRUFBRSxTQUFtQjtRQUMzQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFNBQW1CO1FBQ2pELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsU0FBbUI7UUFDbkQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBUyxFQUFFLEtBQVUsRUFBRSxTQUFtQjtRQUNqRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELEdBQUcsQ0FDRCxJQUFTLEVBQ1QsSUFHbUIsRUFDbkIsS0FBYztRQUVkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQztZQUNmLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFLO1lBQ3JCLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNoQixDQUFrQixDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsR0FBRyxDQUNELElBQVMsRUFDVCxJQUdtQixFQUNuQixLQUFjO1FBRWQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBQ2YsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUs7WUFDckIsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ2hCLENBQWtCLENBQUM7UUFDcEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFJRCxJQUFJLENBQUMsSUFBUyxFQUFFLElBQWE7UUFDM0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBc0NFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBRdWVyeUN1c3RvbVR5cGUgfSBmcm9tICcuL2J1aWxkZXInO1xuaW1wb3J0IHtcbiAgRmllbGQsXG4gIGZ1bmN0aW9ucyxcbiAgT0RhdGFGdW5jdGlvbnMsXG4gIE9EYXRhT3BlcmF0b3JzLFxuICBvcGVyYXRvcnMsXG4gIFJlbmRlcmFibGUsXG59IGZyb20gJy4vc3ludGF4JztcbmltcG9ydCB7IHN5bnRheCB9IGZyb20gJy4vc3ludGF4JztcblxuZXhwb3J0IHR5cGUgQ29ubmVjdG9yID0gJ2FuZCcgfCAnb3InO1xuXG5leHBvcnQgY2xhc3MgRXhwcmVzc2lvbjxUPiBpbXBsZW1lbnRzIFJlbmRlcmFibGUge1xuICBwcml2YXRlIF9jb25uZWN0b3I6IENvbm5lY3RvcjtcbiAgcHJpdmF0ZSBfbmVnYXRlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY2hpbGRyZW46IFJlbmRlcmFibGVbXTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNoaWxkcmVuLFxuICAgIGNvbm5lY3RvcixcbiAgICBuZWdhdGVkLFxuICB9OiB7XG4gICAgY2hpbGRyZW4/OiBSZW5kZXJhYmxlW107XG4gICAgY29ubmVjdG9yPzogQ29ubmVjdG9yO1xuICAgIG5lZ2F0ZWQ/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICB0aGlzLl9jaGlsZHJlbiA9IGNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuX2Nvbm5lY3RvciA9IGNvbm5lY3RvciB8fCAnYW5kJztcbiAgICB0aGlzLl9uZWdhdGVkID0gbmVnYXRlZCB8fCBmYWxzZTtcbiAgfVxuXG4gIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICByZXR1cm4gJ0V4cHJlc3Npb24nO1xuICB9XG5cbiAgc3RhdGljIHM8VCBleHRlbmRzIG9iamVjdD4oKTogVCB7XG4gICAgcmV0dXJuIEZpZWxkLmZhY3Rvcnk8VD4oKTtcbiAgfVxuXG4gIHN0YXRpYyBlPFQ+KGNvbm5lY3RvcjogQ29ubmVjdG9yID0gJ2FuZCcpIHtcbiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb248VD4oeyBjb25uZWN0b3IgfSk7XG4gIH1cblxuICBzdGF0aWMgbzxUPigpOiBPRGF0YU9wZXJhdG9yczxUPiB7XG4gICAgcmV0dXJuIG9wZXJhdG9ycztcbiAgfVxuXG4gIHN0YXRpYyBmPFQ+KCk6IE9EYXRhRnVuY3Rpb25zPFQ+IHtcbiAgICByZXR1cm4gZnVuY3Rpb25zO1xuICB9XG5cbiAgc3RhdGljIGZpbHRlcjxUIGV4dGVuZHMgb2JqZWN0PihcbiAgICBvcHRzOiAoZToge1xuICAgICAgczogVDtcbiAgICAgIGU6IChjb25uZWN0b3I/OiBDb25uZWN0b3IpID0+IEV4cHJlc3Npb248VD47XG4gICAgICBvOiBPRGF0YU9wZXJhdG9yczxUPjtcbiAgICAgIGY6IE9EYXRhRnVuY3Rpb25zPFQ+O1xuICAgIH0pID0+IEV4cHJlc3Npb248VD5cbiAgKTogRXhwcmVzc2lvbjxUPiB7XG4gICAgcmV0dXJuIG9wdHMoe1xuICAgICAgczogRXhwcmVzc2lvbi5zPFQ+KCksXG4gICAgICBlOiBFeHByZXNzaW9uLmUsXG4gICAgICBvOiBFeHByZXNzaW9uLm88VD4oKSxcbiAgICAgIGY6IEV4cHJlc3Npb24uZjxUPigpLFxuICAgIH0pIGFzIEV4cHJlc3Npb248VD47XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoaWxkcmVuOiB0aGlzLl9jaGlsZHJlbi5tYXAoKGMpID0+IGMudG9KU09OKCkpLFxuICAgICAgY29ubmVjdG9yOiB0aGlzLl9jb25uZWN0b3IsXG4gICAgICBuZWdhdGVkOiB0aGlzLl9uZWdhdGVkLFxuICAgIH07XG4gIH1cblxuICBjaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gIH1cblxuICBjb25uZWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3RvcjtcbiAgfVxuXG4gIG5lZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25lZ2F0ZWQ7XG4gIH1cblxuICBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuLmxlbmd0aDtcbiAgfVxuXG4gIHJlbmRlcih7XG4gICAgYWxpYXNlcyxcbiAgICBlc2NhcGUsXG4gICAgcHJlZml4LFxuICB9OiB7XG4gICAgYWxpYXNlcz86IFF1ZXJ5Q3VzdG9tVHlwZVtdO1xuICAgIGVzY2FwZT86IGJvb2xlYW47XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICB9ID0ge30pOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gdGhpcy5fY2hpbGRyZW5cbiAgICAgIC5tYXAoKG4pID0+IG4ucmVuZGVyKHsgYWxpYXNlcywgZXNjYXBlLCBwcmVmaXggfSkpXG4gICAgICAuam9pbihgICR7dGhpcy5fY29ubmVjdG9yfSBgKTtcbiAgICBpZiAodGhpcy5fbmVnYXRlZCkge1xuICAgICAgY29udGVudCA9IGBub3QgKCR7Y29udGVudH0pYDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIF9hZGQobm9kZTogUmVuZGVyYWJsZSwgY29ubmVjdG9yPzogQ29ubmVjdG9yKTogRXhwcmVzc2lvbjxUPiB7XG4gICAgaWYgKGNvbm5lY3RvciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX2Nvbm5lY3RvciAhPT0gY29ubmVjdG9yKSB7XG4gICAgICBsZXQgY2hpbGRyZW46IFJlbmRlcmFibGVbXSA9IFtdO1xuICAgICAgaWYgKHRoaXMuX2NoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNoaWxkcmVuID0gWy4uLnRoaXMuX2NoaWxkcmVuXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgZXhwID0gbmV3IEV4cHJlc3Npb248VD4oe1xuICAgICAgICAgICAgY2hpbGRyZW46IHRoaXMuX2NoaWxkcmVuLFxuICAgICAgICAgICAgY29ubmVjdG9yOiB0aGlzLl9jb25uZWN0b3IsXG4gICAgICAgICAgICBuZWdhdGVkOiB0aGlzLl9uZWdhdGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChleHAubGVuZ3RoKCkgPiAxKSB7XG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHN5bnRheC5ncm91cGluZyhleHApKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChleHApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBub2RlIGluc3RhbmNlb2YgRXhwcmVzc2lvbiAmJlxuICAgICAgICAobm9kZS5jb25uZWN0b3IoKSA9PT0gY29ubmVjdG9yIHx8IG5vZGUubGVuZ3RoKCkgPT09IDEpXG4gICAgICApIHtcbiAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLm5vZGUuY2hpbGRyZW4oKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKHN5bnRheC5ncm91cGluZyhub2RlKSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9jb25uZWN0b3IgPSBjb25uZWN0b3I7XG4gICAgICB0aGlzLl9jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBub2RlIGluc3RhbmNlb2YgRXhwcmVzc2lvbiAmJlxuICAgICAgIW5vZGUubmVnYXRlZCgpICYmXG4gICAgICAobm9kZS5jb25uZWN0b3IoKSA9PT0gY29ubmVjdG9yIHx8IG5vZGUubGVuZ3RoKCkgPT09IDEpXG4gICAgKSB7XG4gICAgICB0aGlzLl9jaGlsZHJlbiA9IFsuLi50aGlzLl9jaGlsZHJlbiwgLi4ubm9kZS5jaGlsZHJlbigpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY2hpbGRyZW4ucHVzaChcbiAgICAgICAgbm9kZSBpbnN0YW5jZW9mIEV4cHJlc3Npb24gJiYgIW5vZGUubmVnYXRlZCgpXG4gICAgICAgICAgPyBzeW50YXguZ3JvdXBpbmcobm9kZSlcbiAgICAgICAgICA6IG5vZGVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb3IoZXhwOiBFeHByZXNzaW9uPFQ+KTogRXhwcmVzc2lvbjxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZChleHAsICdvcicpO1xuICB9XG5cbiAgYW5kKGV4cDogRXhwcmVzc2lvbjxUPik6IEV4cHJlc3Npb248VD4ge1xuICAgIHJldHVybiB0aGlzLl9hZGQoZXhwLCAnYW5kJyk7XG4gIH1cblxuICBub3QoZXhwOiBFeHByZXNzaW9uPFQ+KTogRXhwcmVzc2lvbjxUPiB7XG4gICAgY29uc3Qgbm90RXhwID0gbmV3IEV4cHJlc3Npb248VD4oe1xuICAgICAgY2hpbGRyZW46IGV4cC5jaGlsZHJlbigpLFxuICAgICAgY29ubmVjdG9yOiBleHAuY29ubmVjdG9yKCksXG4gICAgICBuZWdhdGVkOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX2FkZChub3RFeHAsIHRoaXMuX2Nvbm5lY3Rvcik7XG4gIH1cblxuICBlcShsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG9wZXJhdG9ycy5lcShsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBuZShsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG9wZXJhdG9ycy5uZShsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBndChsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG9wZXJhdG9ycy5ndChsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBnZShsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG9wZXJhdG9ycy5nZShsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBsdChsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG9wZXJhdG9ycy5sdChsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBsZShsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG9wZXJhdG9ycy5sZShsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBoYXMobGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZChvcGVyYXRvcnMuaGFzKGxlZnQsIHJpZ2h0LCBub3JtYWxpemUpKTtcbiAgfVxuXG4gIGluKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplPzogYm9vbGVhbikge1xuICAgIHJldHVybiB0aGlzLl9hZGQob3BlcmF0b3JzLmluKGxlZnQsIHJpZ2h0LCBub3JtYWxpemUpKTtcbiAgfVxuXG4gIGNvbnRhaW5zKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgbm9ybWFsaXplPzogYm9vbGVhbikge1xuICAgIHJldHVybiB0aGlzLl9hZGQoZnVuY3Rpb25zLmNvbnRhaW5zKGxlZnQsIHJpZ2h0LCBub3JtYWxpemUpKTtcbiAgfVxuXG4gIHN0YXJ0c1dpdGgobGVmdDogYW55LCByaWdodDogYW55LCBub3JtYWxpemU/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZChmdW5jdGlvbnMuc3RhcnRzV2l0aChsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBlbmRzV2l0aChsZWZ0OiBhbnksIHJpZ2h0OiBhbnksIG5vcm1hbGl6ZT86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKGZ1bmN0aW9ucy5lbmRzV2l0aChsZWZ0LCByaWdodCwgbm9ybWFsaXplKSk7XG4gIH1cblxuICBhbnk8TiBleHRlbmRzIG9iamVjdD4oXG4gICAgbGVmdDogTltdLFxuICAgIG9wdHM6IChlOiB7XG4gICAgICBzOiBOO1xuICAgICAgZTogKGNvbm5lY3Rvcj86IENvbm5lY3RvcikgPT4gRXhwcmVzc2lvbjxOPjtcbiAgICB9KSA9PiBFeHByZXNzaW9uPE4+LFxuICAgIGFsaWFzPzogc3RyaW5nXG4gICk6IEV4cHJlc3Npb248VD4ge1xuICAgIGNvbnN0IGV4cCA9IG9wdHMoe1xuICAgICAgczogRmllbGQuZmFjdG9yeTxOPigpLFxuICAgICAgZTogRXhwcmVzc2lvbi5lLFxuICAgIH0pIGFzIEV4cHJlc3Npb248Tj47XG4gICAgcmV0dXJuIHRoaXMuX2FkZChzeW50YXguYW55KGxlZnQsIGV4cCwgYWxpYXMpKTtcbiAgfVxuXG4gIGFsbDxOIGV4dGVuZHMgb2JqZWN0PihcbiAgICBsZWZ0OiBOW10sXG4gICAgb3B0czogKGU6IHtcbiAgICAgIHM6IE47XG4gICAgICBlOiAoY29ubmVjdG9yPzogQ29ubmVjdG9yKSA9PiBFeHByZXNzaW9uPE4+O1xuICAgIH0pID0+IEV4cHJlc3Npb248Tj4sXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKTogRXhwcmVzc2lvbjxUPiB7XG4gICAgY29uc3QgZXhwID0gb3B0cyh7XG4gICAgICBzOiBGaWVsZC5mYWN0b3J5PE4+KCksXG4gICAgICBlOiBFeHByZXNzaW9uLmUsXG4gICAgfSkgYXMgRXhwcmVzc2lvbjxOPjtcbiAgICByZXR1cm4gdGhpcy5fYWRkKHN5bnRheC5hbGwobGVmdCwgZXhwLCBhbGlhcykpO1xuICB9XG5cbiAgaXNvZih0eXBlOiBzdHJpbmcpOiBFeHByZXNzaW9uPFQ+O1xuICBpc29mKGxlZnQ6IFQsIHR5cGU6IHN0cmluZyk6IEV4cHJlc3Npb248VD47XG4gIGlzb2YobGVmdDogYW55LCB0eXBlPzogc3RyaW5nKTogRXhwcmVzc2lvbjxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZChzeW50YXguaXNvZihsZWZ0LCB0eXBlKSk7XG4gIH1cbn1cblxuLypcbmV4cG9ydCBjbGFzcyBGaWx0ZXJFeHByZXNzaW9uPFQ+IGV4dGVuZHMgRXhwcmVzc2lvbjxUPiB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBjaGlsZHJlbixcbiAgICBjb25uZWN0b3IsXG4gICAgbmVnYXRlZCxcbiAgfToge1xuICAgIGNoaWxkcmVuPzogUmVuZGVyYWJsZVtdO1xuICAgIGNvbm5lY3Rvcj86IENvbm5lY3RvcjtcbiAgICBuZWdhdGVkPzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoeyBjaGlsZHJlbiwgY29ubmVjdG9yLCBuZWdhdGVkIH0pO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnRmlsdGVyRXhwcmVzc2lvbic7XG4gIH1cblxuICBzdGF0aWMgZTxUPigpIHtcbiAgICByZXR1cm4gbmV3IEZpbHRlckV4cHJlc3Npb248VD4oeyBjb25uZWN0b3I6IENvbm5lY3Rvci5BTkQgfSk7XG4gIH1cblxuICBzdGF0aWMgYW5kPFQ+KCkge1xuICAgIHJldHVybiBuZXcgRmlsdGVyRXhwcmVzc2lvbjxUPih7IGNvbm5lY3RvcjogQ29ubmVjdG9yLkFORCB9KTtcbiAgfVxuXG4gIHN0YXRpYyBvcjxUPigpIHtcbiAgICByZXR1cm4gbmV3IEZpbHRlckV4cHJlc3Npb248VD4oeyBjb25uZWN0b3I6IENvbm5lY3Rvci5PUiB9KTtcbiAgfVxuXG4gIHN0YXRpYyBub3Q8VD4oZXhwOiBGaWx0ZXJFeHByZXNzaW9uPFQ+KSB7XG4gICAgcmV0dXJuIG5ldyBGaWx0ZXJFeHByZXNzaW9uPFQ+KHtcbiAgICAgIGNoaWxkcmVuOiBleHAuY2hpbGRyZW4oKSxcbiAgICAgIGNvbm5lY3RvcjogZXhwLmNvbm5lY3RvcigpLFxuICAgICAgbmVnYXRlZDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxufVxuKi9cbiJdfQ==
|