angular-odata 0.128.0 → 0.131.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -244
- package/fesm2022/angular-odata.mjs +2320 -1118
- package/fesm2022/angular-odata.mjs.map +1 -1
- package/lib/api.d.ts +10 -11
- package/lib/cache/cache.d.ts +2 -2
- package/lib/cache/memory.d.ts +2 -2
- package/lib/cache/storage.d.ts +2 -2
- package/lib/index.d.ts +1 -0
- package/lib/loaders.d.ts +8 -8
- package/lib/metadata/csdl/csdl-annotation.d.ts +62 -26
- package/lib/metadata/csdl/csdl-entity-container.d.ts +8 -3
- package/lib/metadata/csdl/csdl-entity-set.d.ts +7 -2
- package/lib/metadata/csdl/csdl-enum-type.d.ts +11 -3
- package/lib/metadata/csdl/csdl-function-action.d.ts +54 -11
- package/lib/metadata/csdl/csdl-navigation-property-binding.d.ts +4 -0
- package/lib/metadata/csdl/csdl-reference.d.ts +26 -3
- package/lib/metadata/csdl/csdl-schema.d.ts +5 -2
- package/lib/metadata/csdl/csdl-singleton.d.ts +5 -0
- package/lib/metadata/csdl/csdl-structural-property.d.ts +19 -3
- package/lib/metadata/csdl/csdl-structured-type.d.ts +28 -7
- package/lib/metadata/csdl/csdl-type-definition.d.ts +3 -0
- package/lib/metadata/metadata.d.ts +16 -3
- package/lib/models/collection.d.ts +2 -1
- package/lib/models/model.d.ts +6 -5
- package/lib/models/options.d.ts +11 -4
- package/lib/module.d.ts +3 -3
- package/lib/options.d.ts +3 -3
- package/lib/resources/path/segments.d.ts +3 -3
- package/lib/resources/query/builder.d.ts +3 -2
- package/lib/resources/query/expressions/apply.d.ts +1 -1
- package/lib/resources/query/expressions/compute.d.ts +1 -1
- package/lib/resources/query/expressions/count.d.ts +1 -1
- package/lib/resources/query/expressions/expand.d.ts +5 -2
- package/lib/resources/query/expressions/filter.d.ts +2 -1
- package/lib/resources/query/expressions/orderby.d.ts +2 -1
- package/lib/resources/query/expressions/search.d.ts +2 -1
- package/lib/resources/query/expressions/select.d.ts +2 -1
- package/lib/resources/query/expressions/syntax.d.ts +2 -2
- package/lib/resources/query/handlers.d.ts +17 -5
- package/lib/resources/query/options.d.ts +3 -3
- package/lib/resources/resource.d.ts +36 -8
- package/lib/resources/types/action.d.ts +4 -4
- package/lib/resources/types/entity-set.d.ts +15 -8
- package/lib/resources/types/entity.d.ts +5 -1
- package/lib/resources/types/function.d.ts +4 -4
- package/lib/resources/types/navigation-property.d.ts +12 -3
- package/lib/resources/types/property.d.ts +14 -3
- package/lib/resources/types/singleton.d.ts +5 -1
- package/lib/schema/annotation.d.ts +3 -3
- package/lib/schema/callable.d.ts +3 -3
- package/lib/schema/element.d.ts +3 -3
- package/lib/schema/entity-container.d.ts +2 -2
- package/lib/schema/entity-set.d.ts +2 -2
- package/lib/schema/enum-type.d.ts +10 -10
- package/lib/schema/parsers/callable.d.ts +4 -4
- package/lib/schema/parsers/enum-type.d.ts +15 -15
- package/lib/schema/parsers/structured-type.d.ts +8 -5
- package/lib/schema/schema.d.ts +3 -3
- package/lib/schema/singleton.d.ts +2 -2
- package/lib/schema/structured-type.d.ts +7 -4
- package/lib/services/entity-set.d.ts +9 -6
- package/lib/services/entity.d.ts +1 -1
- package/lib/services/singleton.d.ts +1 -1
- package/lib/settings.d.ts +2 -2
- package/lib/types.d.ts +82 -69
- package/lib/utils/enums.d.ts +12 -12
- package/lib/utils/http.d.ts +1 -1
- package/lib/utils/objects.d.ts +1 -1
- package/lib/utils/odata.d.ts +2 -2
- package/lib/utils/strings.d.ts +2 -2
- package/package.json +3 -5
- package/schematics/apigen/angular/api-config.js +7 -1
- package/schematics/apigen/angular/api-config.js.map +1 -1
- package/schematics/apigen/angular/base.d.ts +22 -2
- package/schematics/apigen/angular/base.js +82 -42
- package/schematics/apigen/angular/base.js.map +1 -1
- package/schematics/apigen/angular/entity.js +7 -1
- package/schematics/apigen/angular/entity.js.map +1 -1
- package/schematics/apigen/angular/enum.js +1 -0
- package/schematics/apigen/angular/enum.js.map +1 -1
- package/schematics/apigen/angular/module.js.map +1 -1
- package/schematics/apigen/angular/service.js +3 -2
- package/schematics/apigen/angular/service.js.map +1 -1
- package/schematics/apigen/files/api-config/__fileName__.ts +8 -6
- package/schematics/apigen/files/entity/__fileName__.ts +2 -2
- package/schematics/apigen/files/entitycontainer-service/__fileName__.ts +1 -1
- package/schematics/apigen/files/entityset-service/__fileName__.ts +1 -1
- package/schematics/apigen/files/enum/__fileName__.ts +1 -1
- package/schematics/apigen/files/metadata/metadata.json +1 -0
- package/schematics/apigen/files/singleton-service/__fileName__.ts +1 -1
- package/schematics/apigen/index.js +56 -12
- package/schematics/apigen/index.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-annotation.d.ts +56 -23
- package/schematics/apigen/metadata/csdl/csdl-annotation.js +143 -13
- package/schematics/apigen/metadata/csdl/csdl-annotation.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-entity-container.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-container.js +19 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-container.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-entity-set.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-set.js +11 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-set.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-enum-type.d.ts +6 -0
- package/schematics/apigen/metadata/csdl/csdl-enum-type.js +17 -0
- package/schematics/apigen/metadata/csdl/csdl-enum-type.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-function-action.d.ts +37 -0
- package/schematics/apigen/metadata/csdl/csdl-function-action.js +52 -0
- package/schematics/apigen/metadata/csdl/csdl-function-action.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.d.ts +4 -0
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js +6 -0
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-reference.d.ts +15 -3
- package/schematics/apigen/metadata/csdl/csdl-reference.js +26 -2
- package/schematics/apigen/metadata/csdl/csdl-reference.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-schema.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-schema.js +37 -0
- package/schematics/apigen/metadata/csdl/csdl-schema.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-singleton.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-singleton.js +8 -0
- package/schematics/apigen/metadata/csdl/csdl-singleton.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-structural-property.d.ts +16 -0
- package/schematics/apigen/metadata/csdl/csdl-structural-property.js +53 -0
- package/schematics/apigen/metadata/csdl/csdl-structural-property.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-structured-type.d.ts +22 -3
- package/schematics/apigen/metadata/csdl/csdl-structured-type.js +47 -2
- package/schematics/apigen/metadata/csdl/csdl-structured-type.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-type-definition.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-type-definition.js +19 -0
- package/schematics/apigen/metadata/csdl/csdl-type-definition.js.map +1 -1
- package/schematics/apigen/metadata/metadata.d.ts +10 -0
- package/schematics/apigen/metadata/metadata.js +12 -6
- package/schematics/apigen/metadata/metadata.js.map +1 -1
- package/schematics/apigen/metadata/parser.js.map +1 -1
- package/schematics/apigen/schema.d.ts +2 -1
- package/schematics/apigen/schema.json +15 -14
- package/schematics/apigen/utils.d.ts +1 -0
- package/schematics/apigen/utils.js +25 -1
- package/schematics/apigen/utils.js.map +1 -1
- package/schematics/ng-add/index.js +1 -2
- package/schematics/ng-add/index.js.map +1 -1
- package/esm2022/angular-odata.mjs +0 -5
- package/esm2022/lib/annotations.mjs +0 -140
- package/esm2022/lib/api.mjs +0 -419
- package/esm2022/lib/cache/cache.mjs +0 -175
- package/esm2022/lib/cache/index.mjs +0 -4
- package/esm2022/lib/cache/memory.mjs +0 -30
- package/esm2022/lib/cache/storage.mjs +0 -55
- package/esm2022/lib/client.mjs +0 -212
- package/esm2022/lib/constants.mjs +0 -95
- package/esm2022/lib/helper.mjs +0 -280
- package/esm2022/lib/index.mjs +0 -21
- package/esm2022/lib/loaders.mjs +0 -39
- package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -95
- package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -27
- package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -24
- package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -37
- package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -94
- package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -7
- package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -23
- package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -39
- package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -15
- package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -70
- package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -92
- package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -15
- package/esm2022/lib/metadata/index.mjs +0 -3
- package/esm2022/lib/metadata/metadata.mjs +0 -14
- package/esm2022/lib/metadata/parser.mjs +0 -563
- package/esm2022/lib/models/collection.mjs +0 -814
- package/esm2022/lib/models/index.mjs +0 -4
- package/esm2022/lib/models/model.mjs +0 -553
- package/esm2022/lib/models/options.mjs +0 -1179
- package/esm2022/lib/module.mjs +0 -55
- package/esm2022/lib/options.mjs +0 -36
- package/esm2022/lib/resources/index.mjs +0 -7
- package/esm2022/lib/resources/options.mjs +0 -56
- package/esm2022/lib/resources/path/handlers.mjs +0 -79
- package/esm2022/lib/resources/path/index.mjs +0 -3
- package/esm2022/lib/resources/path/segments.mjs +0 -148
- package/esm2022/lib/resources/query/builder.mjs +0 -636
- package/esm2022/lib/resources/query/expressions/apply.mjs +0 -236
- package/esm2022/lib/resources/query/expressions/base.mjs +0 -25
- package/esm2022/lib/resources/query/expressions/compute.mjs +0 -54
- package/esm2022/lib/resources/query/expressions/count.mjs +0 -116
- package/esm2022/lib/resources/query/expressions/expand.mjs +0 -147
- package/esm2022/lib/resources/query/expressions/filter.mjs +0 -178
- package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
- package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -79
- package/esm2022/lib/resources/query/expressions/search.mjs +0 -141
- package/esm2022/lib/resources/query/expressions/select.mjs +0 -47
- package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -751
- package/esm2022/lib/resources/query/handlers.mjs +0 -420
- package/esm2022/lib/resources/query/index.mjs +0 -5
- package/esm2022/lib/resources/query/options.mjs +0 -139
- package/esm2022/lib/resources/request.mjs +0 -196
- package/esm2022/lib/resources/resource.mjs +0 -311
- package/esm2022/lib/resources/response.mjs +0 -174
- package/esm2022/lib/resources/types/action.mjs +0 -116
- package/esm2022/lib/resources/types/batch.mjs +0 -428
- package/esm2022/lib/resources/types/count.mjs +0 -33
- package/esm2022/lib/resources/types/entity-set.mjs +0 -131
- package/esm2022/lib/resources/types/entity.mjs +0 -112
- package/esm2022/lib/resources/types/function.mjs +0 -146
- package/esm2022/lib/resources/types/index.mjs +0 -15
- package/esm2022/lib/resources/types/media.mjs +0 -44
- package/esm2022/lib/resources/types/metadata.mjs +0 -35
- package/esm2022/lib/resources/types/navigation-property.mjs +0 -256
- package/esm2022/lib/resources/types/options.mjs +0 -2
- package/esm2022/lib/resources/types/property.mjs +0 -197
- package/esm2022/lib/resources/types/reference.mjs +0 -87
- package/esm2022/lib/resources/types/singleton.mjs +0 -130
- package/esm2022/lib/resources/types/value.mjs +0 -48
- package/esm2022/lib/schema/annotation.mjs +0 -37
- package/esm2022/lib/schema/callable.mjs +0 -66
- package/esm2022/lib/schema/element.mjs +0 -67
- package/esm2022/lib/schema/entity-container.mjs +0 -11
- package/esm2022/lib/schema/entity-set.mjs +0 -9
- package/esm2022/lib/schema/enum-type.mjs +0 -68
- package/esm2022/lib/schema/index.mjs +0 -9
- package/esm2022/lib/schema/parsers/callable.mjs +0 -110
- package/esm2022/lib/schema/parsers/edm.mjs +0 -101
- package/esm2022/lib/schema/parsers/enum-type.mjs +0 -130
- package/esm2022/lib/schema/parsers/index.mjs +0 -5
- package/esm2022/lib/schema/parsers/structured-type.mjs +0 -514
- package/esm2022/lib/schema/schema.mjs +0 -45
- package/esm2022/lib/schema/singleton.mjs +0 -9
- package/esm2022/lib/schema/structured-type.mjs +0 -213
- package/esm2022/lib/services/base.mjs +0 -29
- package/esm2022/lib/services/entity-set.mjs +0 -155
- package/esm2022/lib/services/entity.mjs +0 -12
- package/esm2022/lib/services/factory.mjs +0 -44
- package/esm2022/lib/services/index.mjs +0 -5
- package/esm2022/lib/services/singleton.mjs +0 -54
- package/esm2022/lib/settings.mjs +0 -112
- package/esm2022/lib/types.mjs +0 -118
- package/esm2022/lib/utils/arraybuffers.mjs +0 -46
- package/esm2022/lib/utils/arrays.mjs +0 -10
- package/esm2022/lib/utils/dates.mjs +0 -18
- package/esm2022/lib/utils/durations.mjs +0 -40
- package/esm2022/lib/utils/enums.mjs +0 -61
- package/esm2022/lib/utils/http.mjs +0 -95
- package/esm2022/lib/utils/index.mjs +0 -10
- package/esm2022/lib/utils/objects.mjs +0 -204
- package/esm2022/lib/utils/odata.mjs +0 -22
- package/esm2022/lib/utils/strings.mjs +0 -20
- package/esm2022/lib/utils/types.mjs +0 -136
- package/esm2022/lib/utils/urls.mjs +0 -24
- package/esm2022/public-api.mjs +0 -5
package/esm2022/lib/api.mjs
DELETED
|
@@ -1,419 +0,0 @@
|
|
|
1
|
-
import { HttpEventType } from '@angular/common/http';
|
|
2
|
-
import { NEVER } from 'rxjs';
|
|
3
|
-
import { catchError, map } from 'rxjs/operators';
|
|
4
|
-
import { ODataInMemoryCache } from './cache';
|
|
5
|
-
import { DEFAULT_VERSION } from './constants';
|
|
6
|
-
import { ODataCollection, ODataModel, } from './models';
|
|
7
|
-
import { ODataApiOptions } from './options';
|
|
8
|
-
import { ODataQueryOptions, ODataPathSegments, ODataRequest, ODataResponse, ODataBatchResource, ODataMetadataResource, ODataActionResource, ODataFunctionResource, ODataEntityResource, ODataEntitySetResource, ODataSingletonResource, ODataNavigationPropertyResource, } from './resources';
|
|
9
|
-
import { EDM_PARSERS, ODataSchema, } from './schema';
|
|
10
|
-
import { NONE_PARSER, PathSegment, } from './types';
|
|
11
|
-
/**
|
|
12
|
-
* Api abstraction for consuming OData services.
|
|
13
|
-
*/
|
|
14
|
-
export class ODataApi {
|
|
15
|
-
constructor(config) {
|
|
16
|
-
//# region Find by Type
|
|
17
|
-
// Memoize
|
|
18
|
-
this.memo = {
|
|
19
|
-
enumTypes: new Map(),
|
|
20
|
-
structuredTypes: new Map(),
|
|
21
|
-
callables: new Map(),
|
|
22
|
-
entitySets: new Map(),
|
|
23
|
-
singletons: new Map(),
|
|
24
|
-
parsers: new Map(),
|
|
25
|
-
options: new Map(),
|
|
26
|
-
};
|
|
27
|
-
this.serviceRootUrl = config.serviceRootUrl;
|
|
28
|
-
if (this.serviceRootUrl.indexOf('?') != -1)
|
|
29
|
-
throw new Error("The 'serviceRootUrl' should not contain query string. Please use 'params' to add extra parameters");
|
|
30
|
-
if (!this.serviceRootUrl.endsWith('/'))
|
|
31
|
-
this.serviceRootUrl += '/';
|
|
32
|
-
this.metadataUrl = `${this.serviceRootUrl}$metadata`;
|
|
33
|
-
this.name = config.name;
|
|
34
|
-
this.version = config.version ?? DEFAULT_VERSION;
|
|
35
|
-
this.default = config.default ?? false;
|
|
36
|
-
this.creation = config.creation ?? new Date();
|
|
37
|
-
this.options = new ODataApiOptions(Object.assign({ version: this.version }, config.options || {}));
|
|
38
|
-
this.cache = config.cache || new ODataInMemoryCache();
|
|
39
|
-
this.errorHandler = config.errorHandler;
|
|
40
|
-
this.parsers = new Map(Object.entries(config.parsers || EDM_PARSERS));
|
|
41
|
-
this.schemas = (config.schemas ?? []).map((schema) => new ODataSchema(schema, this));
|
|
42
|
-
}
|
|
43
|
-
configure(settings = {}) {
|
|
44
|
-
this.requester = settings.requester;
|
|
45
|
-
this.schemas.forEach((schema) => {
|
|
46
|
-
schema.configure({
|
|
47
|
-
options: this.options.parserOptions,
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
populate(metadata) {
|
|
52
|
-
const config = metadata.toConfig();
|
|
53
|
-
this.version = config.version ?? DEFAULT_VERSION;
|
|
54
|
-
const schemas = (config.schemas ?? []).map((schema) => new ODataSchema(schema, this));
|
|
55
|
-
this.schemas = [...this.schemas, ...schemas];
|
|
56
|
-
schemas.forEach((schema) => {
|
|
57
|
-
schema.configure({
|
|
58
|
-
options: this.options.parserOptions,
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
fromJson(json) {
|
|
63
|
-
const segments = ODataPathSegments.fromJson(json.segments);
|
|
64
|
-
const query = ODataQueryOptions.fromJson(json.options);
|
|
65
|
-
switch (segments.last()?.name) {
|
|
66
|
-
case PathSegment.entitySet:
|
|
67
|
-
if (segments.last()?.hasKey()) {
|
|
68
|
-
return new ODataEntityResource(this, { segments, query });
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
return new ODataEntitySetResource(this, { segments, query });
|
|
72
|
-
}
|
|
73
|
-
case PathSegment.navigationProperty:
|
|
74
|
-
return new ODataNavigationPropertyResource(this, { segments, query });
|
|
75
|
-
case PathSegment.singleton:
|
|
76
|
-
return new ODataSingletonResource(this, { segments, query });
|
|
77
|
-
case PathSegment.action:
|
|
78
|
-
return new ODataActionResource(this, { segments, query });
|
|
79
|
-
case PathSegment.function:
|
|
80
|
-
return new ODataFunctionResource(this, { segments, query });
|
|
81
|
-
}
|
|
82
|
-
throw new Error('No Resource for json');
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Build a metadata resource.
|
|
86
|
-
* @returns ODataMetadataResource
|
|
87
|
-
*/
|
|
88
|
-
metadata() {
|
|
89
|
-
return ODataMetadataResource.factory(this);
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Build a batch resource.
|
|
93
|
-
* @returns ODataBatchResource
|
|
94
|
-
*/
|
|
95
|
-
batch() {
|
|
96
|
-
return ODataBatchResource.factory(this);
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Build a singleton resource.
|
|
100
|
-
* @param path Name of the singleton
|
|
101
|
-
* @returns
|
|
102
|
-
*/
|
|
103
|
-
singleton(name) {
|
|
104
|
-
const singleton = this.findSingleton(name);
|
|
105
|
-
return ODataSingletonResource.factory(this, {
|
|
106
|
-
path: singleton?.name ?? name,
|
|
107
|
-
type: singleton?.singletonType,
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Build an entity set resource.
|
|
112
|
-
* @param path Name of the entity set
|
|
113
|
-
* @returns
|
|
114
|
-
*/
|
|
115
|
-
entitySet(name) {
|
|
116
|
-
const entitySet = this.findEntitySet(name);
|
|
117
|
-
return ODataEntitySetResource.factory(this, {
|
|
118
|
-
path: entitySet?.name ?? name,
|
|
119
|
-
type: entitySet?.entityType,
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Unbound Action
|
|
124
|
-
* @param {string} path?
|
|
125
|
-
* @returns ODataActionResource
|
|
126
|
-
*/
|
|
127
|
-
action(path) {
|
|
128
|
-
const callable = this.findCallable(path);
|
|
129
|
-
return ODataActionResource.factory(this, {
|
|
130
|
-
path,
|
|
131
|
-
outgoingType: callable?.type(),
|
|
132
|
-
incomingType: callable?.returnType(),
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Unbound Function
|
|
137
|
-
* @param {string} path?
|
|
138
|
-
* @returns ODataFunctionResource
|
|
139
|
-
*/
|
|
140
|
-
function(path) {
|
|
141
|
-
const callable = this.findCallable(path);
|
|
142
|
-
return ODataFunctionResource.factory(this, {
|
|
143
|
-
path,
|
|
144
|
-
outgoingType: callable?.type(),
|
|
145
|
-
incomingType: callable?.returnType(),
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
callable(type) {
|
|
149
|
-
return this.findCallable(type);
|
|
150
|
-
}
|
|
151
|
-
enumType(type) {
|
|
152
|
-
return this.findEnumType(type);
|
|
153
|
-
}
|
|
154
|
-
structuredType(type) {
|
|
155
|
-
return this.findStructuredType(type);
|
|
156
|
-
}
|
|
157
|
-
//request(req: ODataRequest<any>): Observable<any> {
|
|
158
|
-
request(method, resource, options) {
|
|
159
|
-
let req = ODataRequest.factory(this, method, resource, {
|
|
160
|
-
body: options.body,
|
|
161
|
-
etag: options.etag,
|
|
162
|
-
context: options.context,
|
|
163
|
-
headers: options.headers,
|
|
164
|
-
params: options.params,
|
|
165
|
-
responseType: options.responseType,
|
|
166
|
-
observe: (options.observe === 'events' ? 'events' : 'response'),
|
|
167
|
-
withCount: options.withCount,
|
|
168
|
-
bodyQueryOptions: options.bodyQueryOptions,
|
|
169
|
-
reportProgress: options.reportProgress,
|
|
170
|
-
fetchPolicy: options.fetchPolicy,
|
|
171
|
-
parserOptions: options.parserOptions,
|
|
172
|
-
withCredentials: options.withCredentials,
|
|
173
|
-
});
|
|
174
|
-
let res$ = this.requester !== undefined ? this.requester(req) : NEVER;
|
|
175
|
-
res$ = res$.pipe(map((res) => res.type === HttpEventType.Response
|
|
176
|
-
? ODataResponse.fromHttpResponse(req, res)
|
|
177
|
-
: res));
|
|
178
|
-
if (this.errorHandler !== undefined)
|
|
179
|
-
res$ = res$.pipe(catchError(this.errorHandler));
|
|
180
|
-
if (options.observe === 'events') {
|
|
181
|
-
return res$;
|
|
182
|
-
}
|
|
183
|
-
res$ = this.cache.handleRequest(req, res$);
|
|
184
|
-
switch (options.observe || 'body') {
|
|
185
|
-
case 'body':
|
|
186
|
-
switch (options.responseType) {
|
|
187
|
-
case 'entities':
|
|
188
|
-
return res$.pipe(map((res) => res.entities()));
|
|
189
|
-
case 'entity':
|
|
190
|
-
return res$.pipe(map((res) => res.entity()));
|
|
191
|
-
case 'property':
|
|
192
|
-
return res$.pipe(map((res) => res.property()));
|
|
193
|
-
case 'value':
|
|
194
|
-
return res$.pipe(map((res) => res.value()));
|
|
195
|
-
default:
|
|
196
|
-
// Other responseTypes (arraybuffer, blob, json, text) return body
|
|
197
|
-
return res$.pipe(map((res) => res.body));
|
|
198
|
-
}
|
|
199
|
-
case 'response':
|
|
200
|
-
// The response stream was requested directly, so return it.
|
|
201
|
-
return res$;
|
|
202
|
-
default:
|
|
203
|
-
// Guard against new future observe types being added.
|
|
204
|
-
throw new Error(`Unreachable: unhandled observe type ${options.observe}}`);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
createSchema(config) {
|
|
208
|
-
const schema = new ODataSchema(config, this);
|
|
209
|
-
schema.configure({
|
|
210
|
-
options: this.options.parserOptions,
|
|
211
|
-
});
|
|
212
|
-
this.schemas.push(schema);
|
|
213
|
-
return schema;
|
|
214
|
-
}
|
|
215
|
-
findSchema(type) {
|
|
216
|
-
const schemas = this.schemas.filter((s) => s.isNamespaceOf(type));
|
|
217
|
-
if (schemas.length === 0)
|
|
218
|
-
return undefined;
|
|
219
|
-
if (schemas.length === 1)
|
|
220
|
-
return schemas[0];
|
|
221
|
-
return schemas
|
|
222
|
-
.sort((s1, s2) => s1.namespace.length - s2.namespace.length)
|
|
223
|
-
.pop();
|
|
224
|
-
}
|
|
225
|
-
//#region EnumTypes
|
|
226
|
-
findEnumType(value) {
|
|
227
|
-
if (this.memo.enumTypes.has(value)) {
|
|
228
|
-
return this.memo.enumTypes.get(value);
|
|
229
|
-
}
|
|
230
|
-
const enumTypes = this.schemas.reduce((acc, schema) => [...acc, ...schema.enums], []);
|
|
231
|
-
let enumType = enumTypes.find((e) => e.type() === value);
|
|
232
|
-
enumType = enumType ?? enumTypes.find((e) => e.name === value);
|
|
233
|
-
this.memo.enumTypes.set(value, enumType);
|
|
234
|
-
return enumType;
|
|
235
|
-
}
|
|
236
|
-
//#endregion
|
|
237
|
-
//#region StructuredTypes
|
|
238
|
-
findStructuredType(value) {
|
|
239
|
-
if (this.memo.structuredTypes.has(value)) {
|
|
240
|
-
return this.memo.structuredTypes.get(value);
|
|
241
|
-
}
|
|
242
|
-
const structuredTypes = this.schemas.reduce((acc, schema) => [...acc, ...schema.entities], []);
|
|
243
|
-
let structuredType = structuredTypes.find((e) => e.type() === value);
|
|
244
|
-
structuredType =
|
|
245
|
-
structuredType ?? structuredTypes.find((e) => e.name === value);
|
|
246
|
-
this.memo.structuredTypes.set(value, structuredType);
|
|
247
|
-
return structuredType;
|
|
248
|
-
}
|
|
249
|
-
//#endregion
|
|
250
|
-
//#region Callables
|
|
251
|
-
findCallable(value, bindingType) {
|
|
252
|
-
const key = bindingType !== undefined ? `${bindingType}/${value}` : value;
|
|
253
|
-
if (this.memo.callables.has(key)) {
|
|
254
|
-
return this.memo.callables.get(key);
|
|
255
|
-
}
|
|
256
|
-
const bindingStructuredType = bindingType !== undefined
|
|
257
|
-
? this.findStructuredType(bindingType)
|
|
258
|
-
: undefined;
|
|
259
|
-
const callables = this.schemas.reduce((acc, schema) => [...acc, ...schema.callables], []);
|
|
260
|
-
let callable = callables.find((c) => {
|
|
261
|
-
const isCallableType = c.type() == value;
|
|
262
|
-
const callableBindingType = c.binding()?.type;
|
|
263
|
-
const callableBindingStructuredType = callableBindingType !== undefined
|
|
264
|
-
? this.findStructuredType(callableBindingType)
|
|
265
|
-
: undefined;
|
|
266
|
-
return (isCallableType &&
|
|
267
|
-
(!bindingStructuredType ||
|
|
268
|
-
(callableBindingStructuredType &&
|
|
269
|
-
bindingStructuredType.isSubtypeOf(callableBindingStructuredType))));
|
|
270
|
-
});
|
|
271
|
-
callable =
|
|
272
|
-
callable ??
|
|
273
|
-
callables.find((c) => {
|
|
274
|
-
const isCallableType = c.name == value;
|
|
275
|
-
const callableBindingType = c.binding()?.type;
|
|
276
|
-
const callableBindingStructuredType = callableBindingType !== undefined
|
|
277
|
-
? this.findStructuredType(callableBindingType)
|
|
278
|
-
: undefined;
|
|
279
|
-
return (isCallableType &&
|
|
280
|
-
(!bindingStructuredType ||
|
|
281
|
-
(callableBindingStructuredType &&
|
|
282
|
-
bindingStructuredType.isSubtypeOf(callableBindingStructuredType))));
|
|
283
|
-
});
|
|
284
|
-
this.memo.callables.set(key, callable);
|
|
285
|
-
return callable;
|
|
286
|
-
}
|
|
287
|
-
//#endregion
|
|
288
|
-
//#region EntitySets
|
|
289
|
-
findEntitySet(value) {
|
|
290
|
-
if (this.memo.entitySets.has(value)) {
|
|
291
|
-
return this.memo.entitySets.get(value);
|
|
292
|
-
}
|
|
293
|
-
const entitySets = this.schemas.reduce((acc, schema) => [...acc, ...schema.entitySets], []);
|
|
294
|
-
let entitySet = entitySets.find((e) => e.type() === value);
|
|
295
|
-
entitySet = entitySet ?? entitySets.find((e) => e.name === value);
|
|
296
|
-
this.memo.entitySets.set(value, entitySet);
|
|
297
|
-
return entitySet;
|
|
298
|
-
}
|
|
299
|
-
//#endregion
|
|
300
|
-
//#region Singletons
|
|
301
|
-
findSingleton(value) {
|
|
302
|
-
if (this.memo.singletons.has(value)) {
|
|
303
|
-
return this.memo.singletons.get(value);
|
|
304
|
-
}
|
|
305
|
-
const singletons = this.schemas.reduce((acc, schema) => [...acc, ...schema.singletons], []);
|
|
306
|
-
let singleton = singletons.find((e) => e.type() === value);
|
|
307
|
-
singleton = singleton ?? singletons.find((e) => e.name === value);
|
|
308
|
-
this.memo.singletons.set(value, singleton);
|
|
309
|
-
return singleton;
|
|
310
|
-
}
|
|
311
|
-
//#endregion
|
|
312
|
-
findModel(type) {
|
|
313
|
-
return this.findStructuredType(type)?.model;
|
|
314
|
-
}
|
|
315
|
-
createModel(structured) {
|
|
316
|
-
if (structured.model !== undefined)
|
|
317
|
-
return structured.model;
|
|
318
|
-
// Build Ad-hoc model
|
|
319
|
-
const Model = class extends ODataModel {
|
|
320
|
-
};
|
|
321
|
-
// Build Meta
|
|
322
|
-
Model.meta = this.optionsForType(structured.type(), {
|
|
323
|
-
structuredType: structured,
|
|
324
|
-
});
|
|
325
|
-
if (Model.meta !== undefined) {
|
|
326
|
-
// Configure
|
|
327
|
-
Model.meta.configure({
|
|
328
|
-
options: this.options.parserOptions,
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
// Store New Model for next time
|
|
332
|
-
structured.model = Model;
|
|
333
|
-
return Model;
|
|
334
|
-
}
|
|
335
|
-
modelForType(type) {
|
|
336
|
-
let Model = this.findModel(type);
|
|
337
|
-
if (Model === undefined) {
|
|
338
|
-
const structured = this.findStructuredType(type);
|
|
339
|
-
if (structured === undefined)
|
|
340
|
-
throw Error(`No structured type for ${type}`);
|
|
341
|
-
Model = this.createModel(structured);
|
|
342
|
-
}
|
|
343
|
-
return Model;
|
|
344
|
-
}
|
|
345
|
-
findCollection(type) {
|
|
346
|
-
return this.findStructuredType(type)?.collection;
|
|
347
|
-
}
|
|
348
|
-
createCollection(structured, model) {
|
|
349
|
-
if (structured.collection !== undefined)
|
|
350
|
-
return structured.collection;
|
|
351
|
-
if (model === undefined)
|
|
352
|
-
model = this.createModel(structured);
|
|
353
|
-
const Collection = class extends ODataCollection {
|
|
354
|
-
static { this.model = model; }
|
|
355
|
-
};
|
|
356
|
-
structured.collection = Collection;
|
|
357
|
-
return Collection;
|
|
358
|
-
}
|
|
359
|
-
collectionForType(type) {
|
|
360
|
-
let Collection = this.findCollection(type);
|
|
361
|
-
if (Collection === undefined) {
|
|
362
|
-
const structured = this.findStructuredType(type);
|
|
363
|
-
if (structured === undefined)
|
|
364
|
-
throw Error(`No structured type for ${type}`);
|
|
365
|
-
const Model = this.modelForType(type);
|
|
366
|
-
Collection = this.createCollection(structured, Model);
|
|
367
|
-
}
|
|
368
|
-
return Collection;
|
|
369
|
-
}
|
|
370
|
-
findEntitySetForEntityType(entityType) {
|
|
371
|
-
if (this.memo.entitySets.has(entityType)) {
|
|
372
|
-
return this.memo.entitySets.get(entityType);
|
|
373
|
-
}
|
|
374
|
-
const entitySet = this.schemas
|
|
375
|
-
.reduce((acc, schema) => [...acc, ...schema.entitySets], [])
|
|
376
|
-
.find((e) => e.entityType === entityType);
|
|
377
|
-
this.memo.entitySets.set(entityType, entitySet);
|
|
378
|
-
return entitySet;
|
|
379
|
-
}
|
|
380
|
-
parserForType(type, bindingType) {
|
|
381
|
-
const key = bindingType !== undefined ? `${bindingType}/${type}` : type;
|
|
382
|
-
if (this.memo.parsers.has(key)) {
|
|
383
|
-
return this.memo.parsers.get(key);
|
|
384
|
-
}
|
|
385
|
-
// None Parser by default
|
|
386
|
-
let parser = NONE_PARSER;
|
|
387
|
-
if (this.parsers.has(type)) {
|
|
388
|
-
// Edm, Base Parsers
|
|
389
|
-
parser = this.parsers.get(type);
|
|
390
|
-
}
|
|
391
|
-
else if (!type.startsWith('Edm.')) {
|
|
392
|
-
// Callable, EnumType, StructuredType (ComplexType and EntityType) Parsers
|
|
393
|
-
let value = this.findCallable(type, bindingType) ??
|
|
394
|
-
this.findEnumType(type) ??
|
|
395
|
-
this.findStructuredType(type);
|
|
396
|
-
parser = value?.parser;
|
|
397
|
-
}
|
|
398
|
-
// Set Parser for next time
|
|
399
|
-
this.memo.parsers.set(key, parser);
|
|
400
|
-
return parser;
|
|
401
|
-
}
|
|
402
|
-
optionsForType(type, { structuredType, config, } = {}) {
|
|
403
|
-
// Strucutred Options
|
|
404
|
-
if (this.memo.options.has(type)) {
|
|
405
|
-
return this.memo.options.get(type);
|
|
406
|
-
}
|
|
407
|
-
let meta = undefined;
|
|
408
|
-
if (!type.startsWith('Edm.')) {
|
|
409
|
-
structuredType = this.findStructuredType(type) ?? structuredType;
|
|
410
|
-
if (structuredType !== undefined) {
|
|
411
|
-
meta = ODataModel.buildMetaOptions({ config, structuredType });
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
// Set Options for next time
|
|
415
|
-
this.memo.options.set(type, meta);
|
|
416
|
-
return meta;
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBYyxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFFTCxlQUFlLEVBQ2YsVUFBVSxHQUVYLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsK0JBQStCLEdBQ2hDLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxXQUFXLEVBSVgsV0FBVyxHQUdaLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFJTCxXQUFXLEVBR1gsV0FBVyxHQUdaLE1BQU0sU0FBUyxDQUFDO0FBR2pCOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFtQm5CLFlBQVksTUFBaUI7UUFtUTdCLHVCQUF1QjtRQUN2QixVQUFVO1FBQ0YsU0FBSSxHQVFSO1lBQ0YsU0FBUyxFQUFFLElBQUksR0FBRyxFQUEwQztZQUM1RCxlQUFlLEVBQUUsSUFBSSxHQUFHLEVBQWdEO1lBQ3hFLFNBQVMsRUFBRSxJQUFJ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LEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7YUFDaEU7U0FDRjtRQUNELDRCQUE0QjtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEV2ZW50LCBIdHRwRXZlbnRUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgTkVWRVIsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9EYXRhQ2FjaGUsIE9EYXRhSW5NZW1vcnlDYWNoZSB9IGZyb20gJy4vY2FjaGUnO1xuaW1wb3J0IHsgREVGQVVMVF9WRVJTSU9OIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgTW9kZWxPcHRpb25zLFxuICBPRGF0YUNvbGxlY3Rpb24sXG4gIE9EYXRhTW9kZWwsXG4gIE9EYXRhTW9kZWxPcHRpb25zLFxufSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBPRGF0YUFwaU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgT0RhdGFPcHRpb25zLCBPRGF0YVJlc291cmNlLCBPRGF0YVNlZ21lbnQgfSBmcm9tICcuL3Jlc291cmNlcyc7XG5pbXBvcnQge1xuICBPRGF0YVF1ZXJ5T3B0aW9ucyxcbiAgT0RhdGFQYXRoU2VnbWVudHMsXG4gIE9EYXRhUmVxdWVzdCxcbiAgT0RhdGFSZXNwb25zZSxcbiAgT0RhdGFCYXRjaFJlc291cmNlLFxuICBPRGF0YU1ldGFkYXRhUmVzb3VyY2UsXG4gIE9EYXRhQWN0aW9uUmVzb3VyY2UsXG4gIE9EYXRhRnVuY3Rpb25SZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSxcbiAgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbn0gZnJvbSAnLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHtcbiAgRURNX1BBUlNFUlMsXG4gIE9EYXRhQ2FsbGFibGUsXG4gIE9EYXRhRW50aXR5U2V0LFxuICBPRGF0YUVudW1UeXBlLFxuICBPRGF0YVNjaGVtYSxcbiAgT0RhdGFTaW5nbGV0b24sXG4gIE9EYXRhU3RydWN0dXJlZFR5cGUsXG59IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB7XG4gIEFwaUNvbmZpZyxcbiAgQXBpT3B0aW9ucyxcbiAgRWRtVHlwZSxcbiAgTk9ORV9QQVJTRVIsXG4gIE9EYXRhVmVyc2lvbixcbiAgUGFyc2VyLFxuICBQYXRoU2VnbWVudCxcbiAgUXVlcnlPcHRpb24sXG4gIFNjaGVtYUNvbmZpZyxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBPRGF0YU1ldGFkYXRhIH0gZnJvbSAnLi9tZXRhZGF0YS9tZXRhZGF0YSc7XG5cbi8qKlxuICogQXBpIGFic3RyYWN0aW9uIGZvciBjb25zdW1pbmcgT0RhdGEgc2VydmljZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBPRGF0YUFwaSB7XG4gIHJlcXVlc3Rlcj86IChyZXF1ZXN0OiBPRGF0YVJlcXVlc3Q8YW55PikgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuICBzZXJ2aWNlUm9vdFVybDogc3RyaW5nO1xuICBtZXRhZGF0YVVybDogc3RyaW5nO1xuICBuYW1lPzogc3RyaW5nO1xuICB2ZXJzaW9uOiBPRGF0YVZlcnNpb247XG4gIGRlZmF1bHQ6IGJvb2xlYW47XG4gIGNyZWF0aW9uOiBEYXRlO1xuICAvLyBPcHRpb25zXG4gIG9wdGlvbnM6IE9EYXRhQXBpT3B0aW9ucztcbiAgLy8gQ2FjaGVcbiAgY2FjaGUhOiBPRGF0YUNhY2hlO1xuICAvLyBFcnJvciBIYW5kbGVyXG4gIGVycm9ySGFuZGxlcj86IChlcnJvcjogYW55LCBjYXVnaHQ6IE9ic2VydmFibGU8YW55PikgPT4gT2JzZXJ2YWJsZTxuZXZlcj47XG4gIC8vIEJhc2UgUGFyc2Vyc1xuICBwYXJzZXJzOiBNYXA8c3RyaW5nLCBQYXJzZXI8YW55Pj47XG4gIC8vIFNjaGVtYXNcbiAgc2NoZW1hczogT0RhdGFTY2hlbWFbXTtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEFwaUNvbmZpZykge1xuICAgIHRoaXMuc2VydmljZVJvb3RVcmwgPSBjb25maWcuc2VydmljZVJvb3RVcmw7XG4gICAgaWYgKHRoaXMuc2VydmljZVJvb3RVcmwuaW5kZXhPZignPycpICE9IC0xKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlRoZSAnc2VydmljZVJvb3RVcmwnIHNob3VsZCBub3QgY29udGFpbiBxdWVyeSBzdHJpbmcuIFBsZWFzZSB1c2UgJ3BhcmFtcycgdG8gYWRkIGV4dHJhIHBhcmFtZXRlcnNcIixcbiAgICAgICk7XG4gICAgaWYgKCF0aGlzLnNlcnZpY2VSb290VXJsLmVuZHNXaXRoKCcvJykpIHRoaXMuc2VydmljZVJvb3RVcmwgKz0gJy8nO1xuICAgIHRoaXMubWV0YWRhdGFVcmwgPSBgJHt0aGlzLnNlcnZpY2VSb290VXJsfSRtZXRhZGF0YWA7XG4gICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy52ZXJzaW9uID0gY29uZmlnLnZlcnNpb24gPz8gREVGQVVMVF9WRVJTSU9OO1xuICAgIHRoaXMuZGVmYXVsdCA9IGNvbmZpZy5kZWZhdWx0ID8/IGZhbHNlO1xuICAgIHRoaXMuY3JlYXRpb24gPSBjb25maWcuY3JlYXRpb24gPz8gbmV3IERhdGUoKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBuZXcgT0RhdGFBcGlPcHRpb25zKFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgPEFwaU9wdGlvbnM+eyB2ZXJzaW9uOiB0aGlzLnZlcnNpb24gfSxcbiAgICAgICAgY29uZmlnLm9wdGlvbnMgfHwge30sXG4gICAgICApLFxuICAgICk7XG5cbiAgICB0aGlzLmNhY2hlID0gKGNvbmZpZy5jYWNoZSBhcyBPRGF0YUNhY2hlKSB8fCBuZXcgT0RhdGFJbk1lbW9yeUNhY2hlKCk7XG4gICAgdGhpcy5lcnJvckhhbmRsZXIgPSBjb25maWcuZXJyb3JIYW5kbGVyO1xuXG4gICAgdGhpcy5wYXJzZXJzID0gbmV3IE1hcChPYmplY3QuZW50cmllcyhjb25maWcucGFyc2VycyB8fCBFRE1fUEFSU0VSUykpO1xuXG4gICAgdGhpcy5zY2hlbWFzID0gKGNvbmZpZy5zY2hlbWFzID8/IFtdKS5tYXAoXG4gICAgICAoc2NoZW1hKSA9PiBuZXcgT0RhdGFTY2hlbWEoc2NoZW1hLCB0aGlzKSxcbiAgICApO1xuICB9XG5cbiAgY29uZmlndXJlKFxuICAgIHNldHRpbmdzOiB7XG4gICAgICByZXF1ZXN0ZXI/OiAocmVxdWVzdDogT0RhdGFSZXF1ZXN0PGFueT4pID0+IE9ic2VydmFibGU8YW55PjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIHRoaXMucmVxdWVzdGVyID0gc2V0dGluZ3MucmVxdWVzdGVyO1xuICAgIHRoaXMuc2NoZW1hcy5mb3JFYWNoKChzY2hlbWEpID0+IHtcbiAgICAgIHNjaGVtYS5jb25maWd1cmUoe1xuICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMucGFyc2VyT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcG9wdWxhdGUobWV0YWRhdGE6IE9EYXRhTWV0YWRhdGEpIHtcbiAgICBjb25zdCBjb25maWcgPSBtZXRhZGF0YS50b0NvbmZpZygpO1xuICAgIHRoaXMudmVyc2lvbiA9IGNvbmZpZy52ZXJzaW9uID8/IERFRkFVTFRfVkVSU0lPTjtcbiAgICBjb25zdCBzY2hlbWFzID0gKGNvbmZpZy5zY2hlbWFzID8/IFtdKS5tYXAoXG4gICAgICAoc2NoZW1hKSA9PiBuZXcgT0RhdGFTY2hlbWEoc2NoZW1hLCB0aGlzKSxcbiAgICApO1xuICAgIHRoaXMuc2NoZW1hcyA9IFsuLi50aGlzLnNjaGVtYXMsIC4uLnNjaGVtYXNdO1xuICAgIHNjaGVtYXMuZm9yRWFjaCgoc2NoZW1hKSA9PiB7XG4gICAgICBzY2hlbWEuY29uZmlndXJlKHtcbiAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLnBhcnNlck9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZyb21Kc29uPFAsIFI+KGpzb246IHtcbiAgICBzZWdtZW50czogT0RhdGFTZWdtZW50W107XG4gICAgb3B0aW9uczogeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIH0pOiBPRGF0YUFjdGlvblJlc291cmNlPFAsIFI+IHwgT0RhdGFGdW5jdGlvblJlc291cmNlPFAsIFI+O1xuICBmcm9tSnNvbjxFPihqc29uOiB7XG4gICAgc2VnbWVudHM6IE9EYXRhU2VnbWVudFtdO1xuICAgIG9wdGlvbnM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICB9KTpcbiAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8RT5cbiAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8RT47XG4gIGZyb21Kc29uKGpzb246IHtcbiAgICBzZWdtZW50czogT0RhdGFTZWdtZW50W107XG4gICAgb3B0aW9uczogeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIH0pIHtcbiAgICBjb25zdCBzZWdtZW50cyA9IE9EYXRhUGF0aFNlZ21lbnRzLmZyb21Kc29uKGpzb24uc2VnbWVudHMpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gT0RhdGFRdWVyeU9wdGlvbnMuZnJvbUpzb248YW55Pihqc29uLm9wdGlvbnMpO1xuICAgIHN3aXRjaCAoc2VnbWVudHMubGFzdCgpPy5uYW1lIGFzIFBhdGhTZWdtZW50KSB7XG4gICAgICBjYXNlIFBhdGhTZWdtZW50LmVudGl0eVNldDpcbiAgICAgICAgaWYgKHNlZ21lbnRzLmxhc3QoKT8uaGFzS2V5KCkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IE9EYXRhRW50aXR5UmVzb3VyY2UodGhpcywgeyBzZWdtZW50cywgcXVlcnkgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBPRGF0YUVudGl0eVNldFJlc291cmNlKHRoaXMsIHsgc2VnbWVudHMsIHF1ZXJ5IH0pO1xuICAgICAgICB9XG4gICAgICBjYXNlIFBhdGhTZWdtZW50Lm5hdmlnYXRpb25Qcm9wZXJ0eTpcbiAgICAgICAgcmV0dXJuIG5ldyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKHRoaXMsIHsgc2VnbWVudHMsIHF1ZXJ5IH0pO1xuICAgICAgY2FzZSBQYXRoU2VnbWVudC5zaW5nbGV0b246XG4gICAgICAgIHJldHVybiBuZXcgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSh0aGlzLCB7IHNlZ21lbnRzLCBxdWVyeSB9KTtcbiAgICAgIGNhc2UgUGF0aFNlZ21lbnQuYWN0aW9uOlxuICAgICAgICByZXR1cm4gbmV3IE9EYXRhQWN0aW9uUmVzb3VyY2UodGhpcywgeyBzZWdtZW50cywgcXVlcnkgfSk7XG4gICAgICBjYXNlIFBhdGhTZWdtZW50LmZ1bmN0aW9uOlxuICAgICAgICByZXR1cm4gbmV3IE9EYXRhRnVuY3Rpb25SZXNvdXJjZSh0aGlzLCB7IHNlZ21lbnRzLCBxdWVyeSB9KTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBSZXNvdXJjZSBmb3IganNvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgbWV0YWRhdGEgcmVzb3VyY2UuXG4gICAqIEByZXR1cm5zIE9EYXRhTWV0YWRhdGFSZXNvdXJjZVxuICAgKi9cbiAgbWV0YWRhdGEoKTogT0RhdGFNZXRhZGF0YVJlc291cmNlIHtcbiAgICByZXR1cm4gT0RhdGFNZXRhZGF0YVJlc291cmNlLmZhY3RvcnkodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBiYXRjaCByZXNvdXJjZS5cbiAgICogQHJldHVybnMgT0RhdGFCYXRjaFJlc291cmNlXG4gICAqL1xuICBiYXRjaCgpOiBPRGF0YUJhdGNoUmVzb3VyY2Uge1xuICAgIHJldHVybiBPRGF0YUJhdGNoUmVzb3VyY2UuZmFjdG9yeSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIHNpbmdsZXRvbiByZXNvdXJjZS5cbiAgICogQHBhcmFtIHBhdGggTmFtZSBvZiB0aGUgc2luZ2xldG9uXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzaW5nbGV0b248VD4obmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2luZ2xldG9uID0gdGhpcy5maW5kU2luZ2xldG9uKG5hbWUpO1xuICAgIHJldHVybiBPRGF0YVNpbmdsZXRvblJlc291cmNlLmZhY3Rvcnk8VD4odGhpcywge1xuICAgICAgcGF0aDogc2luZ2xldG9uPy5uYW1lID8/IG5hbWUsXG4gICAgICB0eXBlOiBzaW5nbGV0b24/LnNpbmdsZXRvblR5cGUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYW4gZW50aXR5IHNldCByZXNvdXJjZS5cbiAgICogQHBhcmFtIHBhdGggTmFtZSBvZiB0aGUgZW50aXR5IHNldFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZW50aXR5U2V0PFQ+KG5hbWU6IHN0cmluZyk6IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD4ge1xuICAgIGNvbnN0IGVudGl0eVNldCA9IHRoaXMuZmluZEVudGl0eVNldChuYW1lKTtcbiAgICByZXR1cm4gT0RhdGFFbnRpdHlTZXRSZXNvdXJjZS5mYWN0b3J5PFQ+KHRoaXMsIHtcbiAgICAgIHBhdGg6IGVudGl0eVNldD8ubmFtZSA/PyBuYW1lLFxuICAgICAgdHlwZTogZW50aXR5U2V0Py5lbnRpdHlUeXBlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuYm91bmQgQWN0aW9uXG4gICAqIEBwYXJhbSAge3N0cmluZ30gcGF0aD9cbiAgICogQHJldHVybnMgT0RhdGFBY3Rpb25SZXNvdXJjZVxuICAgKi9cbiAgYWN0aW9uPFAsIFI+KHBhdGg6IHN0cmluZyk6IE9EYXRhQWN0aW9uUmVzb3VyY2U8UCwgUj4ge1xuICAgIGNvbnN0IGNhbGxhYmxlID0gdGhpcy5maW5kQ2FsbGFibGU8Uj4ocGF0aCk7XG4gICAgcmV0dXJuIE9EYXRhQWN0aW9uUmVzb3VyY2UuZmFjdG9yeTxQLCBSPih0aGlzLCB7XG4gICAgICBwYXRoLFxuICAgICAgb3V0Z29pbmdUeXBlOiBjYWxsYWJsZT8udHlwZSgpLFxuICAgICAgaW5jb21pbmdUeXBlOiBjYWxsYWJsZT8ucmV0dXJuVHlwZSgpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuYm91bmQgRnVuY3Rpb25cbiAgICogQHBhcmFtICB7c3RyaW5nfSBwYXRoP1xuICAgKiBAcmV0dXJucyBPRGF0YUZ1bmN0aW9uUmVzb3VyY2VcbiAgICovXG4gIGZ1bmN0aW9uPFAsIFI+KHBhdGg6IHN0cmluZyk6IE9EYXRhRnVuY3Rpb25SZXNvdXJjZTxQLCBSPiB7XG4gICAgY29uc3QgY2FsbGFibGUgPSB0aGlzLmZpbmRDYWxsYWJsZTxSPihwYXRoKTtcbiAgICByZXR1cm4gT0RhdGFGdW5jdGlvblJlc291cmNlLmZhY3Rvcnk8UCwgUj4odGhpcywge1xuICAgICAgcGF0aCxcbiAgICAgIG91dGdvaW5nVHlwZTogY2FsbGFibGU/LnR5cGUoKSxcbiAgICAgIGluY29taW5nVHlwZTogY2FsbGFibGU/LnJldHVyblR5cGUoKSxcbiAgICB9KTtcbiAgfVxuXG4gIGNhbGxhYmxlPFQ+KHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRDYWxsYWJsZTxUPih0eXBlKTtcbiAgfVxuXG4gIGVudW1UeXBlPFQ+KHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRFbnVtVHlwZTxUPih0eXBlKTtcbiAgfVxuXG4gIHN0cnVjdHVyZWRUeXBlPFQ+KHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZTxUPih0eXBlKTtcbiAgfVxuXG4gIC8vcmVxdWVzdChyZXE6IE9EYXRhUmVxdWVzdDxhbnk+KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmVxdWVzdDxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk/OiBhbnk7XG4gICAgICBldGFnPzogc3RyaW5nO1xuICAgICAgcmVzcG9uc2VUeXBlPzpcbiAgICAgICAgfCAnYXJyYXlidWZmZXInXG4gICAgICAgIHwgJ2Jsb2InXG4gICAgICAgIHwgJ2pzb24nXG4gICAgICAgIHwgJ3RleHQnXG4gICAgICAgIHwgJ3ZhbHVlJ1xuICAgICAgICB8ICdwcm9wZXJ0eSdcbiAgICAgICAgfCAnZW50aXR5J1xuICAgICAgICB8ICdlbnRpdGllcyc7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknIHwgJ2V2ZW50cycgfCAncmVzcG9uc2UnO1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICAgIGJvZHlRdWVyeU9wdGlvbnM/OiBRdWVyeU9wdGlvbltdO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHJlcSA9IE9EYXRhUmVxdWVzdC5mYWN0b3J5KHRoaXMsIG1ldGhvZCwgcmVzb3VyY2UsIHtcbiAgICAgIGJvZHk6IG9wdGlvbnMuYm9keSxcbiAgICAgIGV0YWc6IG9wdGlvbnMuZXRhZyxcbiAgICAgIGNvbnRleHQ6IG9wdGlvbnMuY29udGV4dCxcbiAgICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyxcbiAgICAgIHBhcmFtczogb3B0aW9ucy5wYXJhbXMsXG4gICAgICByZXNwb25zZVR5cGU6IG9wdGlvbnMucmVzcG9uc2VUeXBlLFxuICAgICAgb2JzZXJ2ZTogKG9wdGlvbnMub2JzZXJ2ZSA9PT0gJ2V2ZW50cycgPyAnZXZlbnRzJyA6ICdyZXNwb25zZScpIGFzXG4gICAgICAgIHwgJ2V2ZW50cydcbiAgICAgICAgfCAncmVzcG9uc2UnLFxuICAgICAgd2l0aENvdW50OiBvcHRpb25zLndpdGhDb3VudCxcbiAgICAgIGJvZHlRdWVyeU9wdGlvbnM6IG9wdGlvbnMuYm9keVF1ZXJ5T3B0aW9ucyxcbiAgICAgIHJlcG9ydFByb2dyZXNzOiBvcHRpb25zLnJlcG9ydFByb2dyZXNzLFxuICAgICAgZmV0Y2hQb2xpY3k6IG9wdGlvbnMuZmV0Y2hQb2xpY3ksXG4gICAgICBwYXJzZXJPcHRpb25zOiBvcHRpb25zLnBhcnNlck9wdGlvbnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IG9wdGlvbnMud2l0aENyZWRlbnRpYWxzLFxuICAgIH0pO1xuXG4gICAgbGV0IHJlcyQgPSB0aGlzLnJlcXVlc3RlciAhPT0gdW5kZWZpbmVkID8gdGhpcy5yZXF1ZXN0ZXIocmVxKSA6IE5FVkVSO1xuXG4gICAgcmVzJCA9IHJlcyQucGlwZShcbiAgICAgIG1hcCgocmVzOiBIdHRwRXZlbnQ8YW55PikgPT5cbiAgICAgICAgcmVzLnR5cGUgPT09IEh0dHBFdmVudFR5cGUuUmVzcG9uc2VcbiAgICAgICAgICA/IE9EYXRhUmVzcG9uc2UuZnJvbUh0dHBSZXNwb25zZTxhbnk+KHJlcSwgcmVzKVxuICAgICAgICAgIDogcmVzLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZXJyb3JIYW5kbGVyICE9PSB1bmRlZmluZWQpXG4gICAgICByZXMkID0gcmVzJC5waXBlKGNhdGNoRXJyb3IodGhpcy5lcnJvckhhbmRsZXIpKTtcblxuICAgIGlmIChvcHRpb25zLm9ic2VydmUgPT09ICdldmVudHMnKSB7XG4gICAgICByZXR1cm4gcmVzJDtcbiAgICB9XG5cbiAgICByZXMkID0gdGhpcy5jYWNoZS5oYW5kbGVSZXF1ZXN0KHJlcSwgcmVzJCk7XG5cbiAgICBzd2l0Y2ggKG9wdGlvbnMub2JzZXJ2ZSB8fCAnYm9keScpIHtcbiAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMucmVzcG9uc2VUeXBlKSB7XG4gICAgICAgICAgY2FzZSAnZW50aXRpZXMnOlxuICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKHJlczogT0RhdGFSZXNwb25zZTxUPikgPT4gcmVzLmVudGl0aWVzKCkpKTtcbiAgICAgICAgICBjYXNlICdlbnRpdHknOlxuICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKHJlczogT0RhdGFSZXNwb25zZTxUPikgPT4gcmVzLmVudGl0eSgpKSk7XG4gICAgICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKHJlczogT0RhdGFSZXNwb25zZTxUPikgPT4gcmVzLnByb3BlcnR5KCkpKTtcbiAgICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgICByZXR1cm4gcmVzJC5waXBlKG1hcCgocmVzOiBPRGF0YVJlc3BvbnNlPFQ+KSA9PiByZXMudmFsdWUoKSBhcyBUKSk7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIE90aGVyIHJlc3BvbnNlVHlwZXMgKGFycmF5YnVmZmVyLCBibG9iLCBqc29uLCB0ZXh0KSByZXR1cm4gYm9keVxuICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKHJlczogT0RhdGFSZXNwb25zZTxUPikgPT4gcmVzLmJvZHkpKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAncmVzcG9uc2UnOlxuICAgICAgICAvLyBUaGUgcmVzcG9uc2Ugc3RyZWFtIHdhcyByZXF1ZXN0ZWQgZGlyZWN0bHksIHNvIHJldHVybiBpdC5cbiAgICAgICAgcmV0dXJuIHJlcyQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IG5ldyBmdXR1cmUgb2JzZXJ2ZSB0eXBlcyBiZWluZyBhZGRlZC5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBVbnJlYWNoYWJsZTogdW5oYW5kbGVkIG9ic2VydmUgdHlwZSAke29wdGlvbnMub2JzZXJ2ZX19YCxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyMgcmVnaW9uIEZpbmQgYnkgVHlwZVxuICAvLyBNZW1vaXplXG4gIHByaXZhdGUgbWVtbzoge1xuICAgIGVudW1UeXBlczogTWFwPHN0cmluZywgT0RhdGFFbnVtVHlwZTxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICBzdHJ1Y3R1cmVkVHlwZXM6IE1hcDxzdHJpbmcsIE9EYXRhU3RydWN0dXJlZFR5cGU8YW55PiB8IHVuZGVmaW5lZD47XG4gICAgY2FsbGFibGVzOiBNYXA8c3RyaW5nLCBPRGF0YUNhbGxhYmxlPGFueT4gfCB1bmRlZmluZWQ+O1xuICAgIGVudGl0eVNldHM6IE1hcDxzdHJpbmcsIE9EYXRhRW50aXR5U2V0IHwgdW5kZWZpbmVkPjtcbiAgICBzaW5nbGV0b25zOiBNYXA8c3RyaW5nLCBPRGF0YVNpbmdsZXRvbiB8IHVuZGVmaW5lZD47XG4gICAgcGFyc2VyczogTWFwPHN0cmluZywgUGFyc2VyPGFueT4+O1xuICAgIG9wdGlvbnM6IE1hcDxzdHJpbmcsIE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ+O1xuICB9ID0ge1xuICAgIGVudW1UeXBlczogbmV3IE1hcDxzdHJpbmcsIE9EYXRhRW51bVR5cGU8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICBzdHJ1Y3R1cmVkVHlwZXM6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4gfCB1bmRlZmluZWQ+KCksXG4gICAgY2FsbGFibGVzOiBuZXcgTWFwPHN0cmluZywgT0RhdGFDYWxsYWJsZTxhbnk+IHwgdW5kZWZpbmVkPigpLFxuICAgIGVudGl0eVNldHM6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YUVudGl0eVNldCB8IHVuZGVmaW5lZD4oKSxcbiAgICBzaW5nbGV0b25zOiBuZXcgTWFwPHN0cmluZywgT0RhdGFTaW5nbGV0b24gfCB1bmRlZmluZWQ+KCksXG4gICAgcGFyc2VyczogbmV3IE1hcDxzdHJpbmcsIFBhcnNlcjxhbnk+PigpLFxuICAgIG9wdGlvbnM6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkPigpLFxuICB9O1xuXG4gIHB1YmxpYyBjcmVhdGVTY2hlbWEoY29uZmlnOiBTY2hlbWFDb25maWcpIHtcbiAgICBjb25zdCBzY2hlbWEgPSBuZXcgT0RhdGFTY2hlbWEoY29uZmlnLCB0aGlzKTtcbiAgICBzY2hlbWEuY29uZmlndXJlKHtcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucy5wYXJzZXJPcHRpb25zLFxuICAgIH0pO1xuICAgIHRoaXMuc2NoZW1hcy5wdXNoKHNjaGVtYSk7XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kU2NoZW1hKHR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IHNjaGVtYXMgPSB0aGlzLnNjaGVtYXMuZmlsdGVyKChzKSA9PiBzLmlzTmFtZXNwYWNlT2YodHlwZSkpO1xuICAgIGlmIChzY2hlbWFzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoc2NoZW1hcy5sZW5ndGggPT09IDEpIHJldHVybiBzY2hlbWFzWzBdO1xuICAgIHJldHVybiBzY2hlbWFzXG4gICAgICAuc29ydCgoczEsIHMyKSA9PiBzMS5uYW1lc3BhY2UubGVuZ3RoIC0gczIubmFtZXNwYWNlLmxlbmd0aClcbiAgICAgIC5wb3AoKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBFbnVtVHlwZXNcbiAgcHVibGljIGZpbmRFbnVtVHlwZTxUPih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubWVtby5lbnVtVHlwZXMuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5lbnVtVHlwZXMuZ2V0KHZhbHVlKSBhcyBPRGF0YUVudW1UeXBlPFQ+IHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBlbnVtVHlwZXMgPSB0aGlzLnNjaGVtYXMucmVkdWNlKFxuICAgICAgKGFjYywgc2NoZW1hKSA9PiBbLi4uYWNjLCAuLi5zY2hlbWEuZW51bXNdLFxuICAgICAgPE9EYXRhRW51bVR5cGU8VD5bXT5bXSxcbiAgICApO1xuICAgIGxldCBlbnVtVHlwZSA9IGVudW1UeXBlcy5maW5kKChlKSA9PiBlLnR5cGUoKSA9PT0gdmFsdWUpO1xuICAgIGVudW1UeXBlID0gZW51bVR5cGUgPz8gZW51bVR5cGVzLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gdmFsdWUpO1xuICAgIHRoaXMubWVtby5lbnVtVHlwZXMuc2V0KHZhbHVlLCBlbnVtVHlwZSk7XG4gICAgcmV0dXJuIGVudW1UeXBlO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBTdHJ1Y3R1cmVkVHlwZXNcbiAgcHVibGljIGZpbmRTdHJ1Y3R1cmVkVHlwZTxUPih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubWVtby5zdHJ1Y3R1cmVkVHlwZXMuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5zdHJ1Y3R1cmVkVHlwZXMuZ2V0KHZhbHVlKSBhc1xuICAgICAgICB8IE9EYXRhU3RydWN0dXJlZFR5cGU8VD5cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHN0cnVjdHVyZWRUeXBlcyA9IHRoaXMuc2NoZW1hcy5yZWR1Y2UoXG4gICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5lbnRpdGllc10sXG4gICAgICA8T0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPltdPltdLFxuICAgICk7XG4gICAgbGV0IHN0cnVjdHVyZWRUeXBlID0gc3RydWN0dXJlZFR5cGVzLmZpbmQoKGUpID0+IGUudHlwZSgpID09PSB2YWx1ZSk7XG4gICAgc3RydWN0dXJlZFR5cGUgPVxuICAgICAgc3RydWN0dXJlZFR5cGUgPz8gc3RydWN0dXJlZFR5cGVzLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gdmFsdWUpO1xuICAgIHRoaXMubWVtby5zdHJ1Y3R1cmVkVHlwZXMuc2V0KHZhbHVlLCBzdHJ1Y3R1cmVkVHlwZSk7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRUeXBlO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBDYWxsYWJsZXNcbiAgcHVibGljIGZpbmRDYWxsYWJsZTxSPih2YWx1ZTogc3RyaW5nLCBiaW5kaW5nVHlwZT86IHN0cmluZykge1xuICAgIGNvbnN0IGtleSA9IGJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWQgPyBgJHtiaW5kaW5nVHlwZX0vJHt2YWx1ZX1gIDogdmFsdWU7XG4gICAgaWYgKHRoaXMubWVtby5jYWxsYWJsZXMuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uY2FsbGFibGVzLmdldChrZXkpIGFzIE9EYXRhQ2FsbGFibGU8Uj4gfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgYmluZGluZ1N0cnVjdHVyZWRUeXBlID1cbiAgICAgIGJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZTxhbnk+KGJpbmRpbmdUeXBlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjYWxsYWJsZXMgPSB0aGlzLnNjaGVtYXMucmVkdWNlKFxuICAgICAgKGFjYywgc2NoZW1hKSA9PiBbLi4uYWNjLCAuLi5zY2hlbWEuY2FsbGFibGVzXSxcbiAgICAgIDxPRGF0YUNhbGxhYmxlPFI+W10+W10sXG4gICAgKTtcbiAgICBsZXQgY2FsbGFibGUgPSBjYWxsYWJsZXMuZmluZCgoYykgPT4ge1xuICAgICAgY29uc3QgaXNDYWxsYWJsZVR5cGUgPSBjLnR5cGUoKSA9PSB2YWx1ZTtcbiAgICAgIGNvbnN0IGNhbGxhYmxlQmluZGluZ1R5cGUgPSBjLmJpbmRpbmcoKT8udHlwZTtcbiAgICAgIGNvbnN0IGNhbGxhYmxlQmluZGluZ1N0cnVjdHVyZWRUeXBlID1cbiAgICAgICAgY2FsbGFibGVCaW5kaW5nVHlwZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZShjYWxsYWJsZUJpbmRpbmdUeXBlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICBpc0NhbGxhYmxlVHlwZSAmJlxuICAgICAgICAoIWJpbmRpbmdTdHJ1Y3R1cmVkVHlwZSB8fFxuICAgICAgICAgIChjYWxsYWJsZUJpbmRpbmdTdHJ1Y3R1cmVkVHlwZSAmJlxuICAgICAgICAgICAgYmluZGluZ1N0cnVjdHVyZWRUeXBlLmlzU3VidHlwZU9mKGNhbGxhYmxlQmluZGluZ1N0cnVjdHVyZWRUeXBlKSkpXG4gICAgICApO1xuICAgIH0pO1xuICAgIGNhbGxhYmxlID1cbiAgICAgIGNhbGxhYmxlID8/XG4gICAgICBjYWxsYWJsZXMuZmluZCgoYykgPT4ge1xuICAgICAgICBjb25zdCBpc0NhbGxhYmxlVHlwZSA9IGMubmFtZSA9PSB2YWx1ZTtcbiAgICAgICAgY29uc3QgY2FsbGFibGVCaW5kaW5nVHlwZSA9IGMuYmluZGluZygpPy50eXBlO1xuICAgICAgICBjb25zdCBjYWxsYWJsZUJpbmRpbmdTdHJ1Y3R1cmVkVHlwZSA9XG4gICAgICAgICAgY2FsbGFibGVCaW5kaW5nVHlwZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlKGNhbGxhYmxlQmluZGluZ1R5cGUpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGlzQ2FsbGFibGVUeXBlICYmXG4gICAgICAgICAgKCFiaW5kaW5nU3RydWN0dXJlZFR5cGUgfHxcbiAgICAgICAgICAgIChjYWxsYWJsZUJpbmRpbmdTdHJ1Y3R1cmVkVHlwZSAmJlxuICAgICAgICAgICAgICBiaW5kaW5nU3RydWN0dXJlZFR5cGUuaXNTdWJ0eXBlT2YoY2FsbGFibGVCaW5kaW5nU3RydWN0dXJlZFR5cGUpKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5tZW1vLmNhbGxhYmxlcy5zZXQoa2V5LCBjYWxsYWJsZSk7XG4gICAgcmV0dXJuIGNhbGxhYmxlO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBFbnRpdHlTZXRzXG4gIHB1YmxpYyBmaW5kRW50aXR5U2V0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmVudGl0eVNldHMuaGFzKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5lbnRpdHlTZXRzLmdldCh2YWx1ZSkgYXMgT0RhdGFFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGVudGl0eVNldHMgPSB0aGlzLnNjaGVtYXMucmVkdWNlKFxuICAgICAgKGFjYywgc2NoZW1hKSA9PiBbLi4uYWNjLCAuLi5zY2hlbWEuZW50aXR5U2V0c10sXG4gICAgICA8T0RhdGFFbnRpdHlTZXRbXT5bXSxcbiAgICApO1xuICAgIGxldCBlbnRpdHlTZXQgPSBlbnRpdHlTZXRzLmZpbmQoKGUpID0+IGUudHlwZSgpID09PSB2YWx1ZSk7XG4gICAgZW50aXR5U2V0ID0gZW50aXR5U2V0ID8/IGVudGl0eVNldHMuZmluZCgoZSkgPT4gZS5uYW1lID09PSB2YWx1ZSk7XG4gICAgdGhpcy5tZW1vLmVudGl0eVNldHMuc2V0KHZhbHVlLCBlbnRpdHlTZXQpO1xuICAgIHJldHVybiBlbnRpdHlTZXQ7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFNpbmdsZXRvbnNcbiAgcHVibGljIGZpbmRTaW5nbGV0b24odmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uc2luZ2xldG9ucy5oYXModmFsdWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLnNpbmdsZXRvbnMuZ2V0KHZhbHVlKSBhcyBPRGF0YVNpbmdsZXRvbiB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgc2luZ2xldG9ucyA9IHRoaXMuc2NoZW1hcy5yZWR1Y2UoXG4gICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5zaW5nbGV0b25zXSxcbiAgICAgIDxPRGF0YVNpbmdsZXRvbltdPltdLFxuICAgICk7XG4gICAgbGV0IHNpbmdsZXRvbiA9IHNpbmdsZXRvbnMuZmluZCgoZSkgPT4gZS50eXBlKCkgPT09IHZhbHVlKTtcbiAgICBzaW5nbGV0b24gPSBzaW5nbGV0b24gPz8gc2luZ2xldG9ucy5maW5kKChlKSA9PiBlLm5hbWUgPT09IHZhbHVlKTtcbiAgICB0aGlzLm1lbW8uc2luZ2xldG9ucy5zZXQodmFsdWUsIHNpbmdsZXRvbik7XG4gICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBwdWJsaWMgZmluZE1vZGVsKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZTxhbnk+KHR5cGUpPy5tb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVNb2RlbChzdHJ1Y3R1cmVkOiBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4pIHtcbiAgICBpZiAoc3RydWN0dXJlZC5tb2RlbCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gc3RydWN0dXJlZC5tb2RlbDtcbiAgICAvLyBCdWlsZCBBZC1ob2MgbW9kZWxcbiAgICBjb25zdCBNb2RlbCA9IGNsYXNzIGV4dGVuZHMgT0RhdGFNb2RlbDxhbnk+IHt9IGFzIHR5cGVvZiBPRGF0YU1vZGVsO1xuICAgIC8vIEJ1aWxkIE1ldGFcbiAgICBNb2RlbC5tZXRhID0gdGhpcy5vcHRpb25zRm9yVHlwZShzdHJ1Y3R1cmVkLnR5cGUoKSwge1xuICAgICAgc3RydWN0dXJlZFR5cGU6IHN0cnVjdHVyZWQsXG4gICAgfSkhO1xuICAgIGlmIChNb2RlbC5tZXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIENvbmZpZ3VyZVxuICAgICAgTW9kZWwubWV0YS5jb25maWd1cmUoe1xuICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMucGFyc2VyT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBTdG9yZSBOZXcgTW9kZWwgZm9yIG5leHQgdGltZVxuICAgIHN0cnVjdHVyZWQubW9kZWwgPSBNb2RlbDtcbiAgICByZXR1cm4gTW9kZWw7XG4gIH1cblxuICBwdWJsaWMgbW9kZWxGb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIGxldCBNb2RlbCA9IHRoaXMuZmluZE1vZGVsKHR5cGUpO1xuICAgIGlmIChNb2RlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzdHJ1Y3R1cmVkID0gdGhpcy5maW5kU3RydWN0dXJlZFR5cGU8YW55Pih0eXBlKTtcbiAgICAgIGlmIChzdHJ1Y3R1cmVkID09PSB1bmRlZmluZWQpXG4gICAgICAgIHRocm93IEVycm9yKGBObyBzdHJ1Y3R1cmVkIHR5cGUgZm9yICR7dHlwZX1gKTtcbiAgICAgIE1vZGVsID0gdGhpcy5jcmVhdGVNb2RlbChzdHJ1Y3R1cmVkKTtcbiAgICB9XG4gICAgcmV0dXJuIE1vZGVsO1xuICB9XG5cbiAgcHVibGljIGZpbmRDb2xsZWN0aW9uKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZTxhbnk+KHR5cGUpPy5jb2xsZWN0aW9uO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUNvbGxlY3Rpb24oXG4gICAgc3RydWN0dXJlZDogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxhbnk+LFxuICAgIG1vZGVsPzogdHlwZW9mIE9EYXRhTW9kZWw8YW55PixcbiAgKSB7XG4gICAgaWYgKHN0cnVjdHVyZWQuY29sbGVjdGlvbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gc3RydWN0dXJlZC5jb2xsZWN0aW9uO1xuICAgIGlmIChtb2RlbCA9PT0gdW5kZWZpbmVkKSBtb2RlbCA9IHRoaXMuY3JlYXRlTW9kZWwoc3RydWN0dXJlZCk7XG4gICAgY29uc3QgQ29sbGVjdGlvbiA9IGNsYXNzIGV4dGVuZHMgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PiB7XG4gICAgICBzdGF0aWMgb3ZlcnJpZGUgbW9kZWwgPSBtb2RlbCE7XG4gICAgfSBhcyB0eXBlb2YgT0RhdGFDb2xsZWN0aW9uO1xuICAgIHN0cnVjdHVyZWQuY29sbGVjdGlvbiA9IENvbGxlY3Rpb247XG4gICAgcmV0dXJuIENvbGxlY3Rpb247XG4gIH1cblxuICBwdWJsaWMgY29sbGVjdGlvbkZvclR5cGUodHlwZTogc3RyaW5nKSB7XG4gICAgbGV0IENvbGxlY3Rpb24gPSB0aGlzLmZpbmRDb2xsZWN0aW9uKHR5cGUpO1xuICAgIGlmIChDb2xsZWN0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHN0cnVjdHVyZWQgPSB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZTxhbnk+KHR5cGUpO1xuICAgICAgaWYgKHN0cnVjdHVyZWQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgdGhyb3cgRXJyb3IoYE5vIHN0cnVjdHVyZWQgdHlwZSBmb3IgJHt0eXBlfWApO1xuICAgICAgY29uc3QgTW9kZWwgPSB0aGlzLm1vZGVsRm9yVHlwZSh0eXBlKTtcbiAgICAgIENvbGxlY3Rpb24gPSB0aGlzLmNyZWF0ZUNvbGxlY3Rpb24oc3RydWN0dXJlZCwgTW9kZWwpO1xuICAgIH1cbiAgICByZXR1cm4gQ29sbGVjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kRW50aXR5U2V0Rm9yRW50aXR5VHlwZShlbnRpdHlUeXBlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmVudGl0eVNldHMuaGFzKGVudGl0eVR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmVudGl0eVNldHMuZ2V0KGVudGl0eVR5cGUpIGFzIE9EYXRhRW50aXR5U2V0IHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBlbnRpdHlTZXQgPSB0aGlzLnNjaGVtYXNcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHNjaGVtYSkgPT4gWy4uLmFjYywgLi4uc2NoZW1hLmVudGl0eVNldHNdLFxuICAgICAgICA8T0RhdGFFbnRpdHlTZXRbXT5bXSxcbiAgICAgIClcbiAgICAgIC5maW5kKChlKSA9PiBlLmVudGl0eVR5cGUgPT09IGVudGl0eVR5cGUpO1xuICAgIHRoaXMubWVtby5lbnRpdHlTZXRzLnNldChlbnRpdHlUeXBlLCBlbnRpdHlTZXQpO1xuICAgIHJldHVybiBlbnRpdHlTZXQ7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VyRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcgfCBFZG1UeXBlLCBiaW5kaW5nVHlwZT86IHN0cmluZykge1xuICAgIGNvbnN0IGtleSA9IGJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWQgPyBgJHtiaW5kaW5nVHlwZX0vJHt0eXBlfWAgOiB0eXBlO1xuICAgIGlmICh0aGlzLm1lbW8ucGFyc2Vycy5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5wYXJzZXJzLmdldChrZXkpIGFzIFBhcnNlcjxUPjtcbiAgICB9XG4gICAgLy8gTm9uZSBQYXJzZXIgYnkgZGVmYXVsdFxuICAgIGxldCBwYXJzZXI6IFBhcnNlcjxUPiA9IE5PTkVfUEFSU0VSO1xuICAgIGlmICh0aGlzLnBhcnNlcnMuaGFzKHR5cGUpKSB7XG4gICAgICAvLyBFZG0sIEJhc2UgUGFyc2Vyc1xuICAgICAgcGFyc2VyID0gdGhpcy5wYXJzZXJzLmdldCh0eXBlKSBhcyBQYXJzZXI8VD47XG4gICAgfSBlbHNlIGlmICghdHlwZS5zdGFydHNXaXRoKCdFZG0uJykpIHtcbiAgICAgIC8vIENhbGxhYmxlLCBFbnVtVHlwZSwgU3RydWN0dXJlZFR5cGUgKENvbXBsZXhUeXBlIGFuZCBFbnRpdHlUeXBlKSBQYXJzZXJzXG4gICAgICBsZXQgdmFsdWUgPVxuICAgICAgICB0aGlzLmZpbmRDYWxsYWJsZTxUPih0eXBlLCBiaW5kaW5nVHlwZSkgPz9cbiAgICAgICAgdGhpcy5maW5kRW51bVR5cGU8VD4odHlwZSkgPz9cbiAgICAgICAgdGhpcy5maW5kU3RydWN0dXJlZFR5cGU8VD4odHlwZSk7XG4gICAgICBwYXJzZXIgPSB2YWx1ZT8ucGFyc2VyIGFzIFBhcnNlcjxUPjtcbiAgICB9XG4gICAgLy8gU2V0IFBhcnNlciBmb3IgbmV4dCB0aW1lXG4gICAgdGhpcy5tZW1vLnBhcnNlcnMuc2V0KGtleSwgcGFyc2VyKTtcbiAgICByZXR1cm4gcGFyc2VyO1xuICB9XG5cbiAgcHVibGljIG9wdGlvbnNGb3JUeXBlPFQ+KFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICB7XG4gICAgICBzdHJ1Y3R1cmVkVHlwZSxcbiAgICAgIGNvbmZpZyxcbiAgICB9OiB7IHN0cnVjdHVyZWRUeXBlPzogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPjsgY29uZmlnPzogTW9kZWxPcHRpb25zIH0gPSB7fSxcbiAgKSB7XG4gICAgLy8gU3RydWN1dHJlZCBPcHRpb25zXG4gICAgaWYgKHRoaXMubWVtby5vcHRpb25zLmhhcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5vcHRpb25zLmdldCh0eXBlKSBhcyBPRGF0YU1vZGVsT3B0aW9uczxUPiB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBsZXQgbWV0YTogT0RhdGFNb2RlbE9wdGlvbnM8VD4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCF0eXBlLnN0YXJ0c1dpdGgoJ0VkbS4nKSkge1xuICAgICAgc3RydWN0dXJlZFR5cGUgPSB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZTxUPih0eXBlKSA/PyBzdHJ1Y3R1cmVkVHlwZTtcbiAgICAgIGlmIChzdHJ1Y3R1cmVkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGEgPSBPRGF0YU1vZGVsLmJ1aWxkTWV0YU9wdGlvbnMoeyBjb25maWcsIHN0cnVjdHVyZWRUeXBlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTZXQgT3B0aW9ucyBmb3IgbmV4dCB0aW1lXG4gICAgdGhpcy5tZW1vLm9wdGlvbnMuc2V0KHR5cGUsIG1ldGEpO1xuICAgIHJldHVybiBtZXRhO1xuICB9XG59XG4iXX0=
|