angular-odata 0.130.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/fesm2022/angular-odata.mjs +2298 -2162
- 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/loaders.d.ts +8 -8
- package/lib/metadata/csdl/csdl-annotation.d.ts +3 -3
- package/lib/metadata/csdl/csdl-entity-container.d.ts +2 -2
- package/lib/metadata/csdl/csdl-entity-set.d.ts +2 -2
- package/lib/metadata/csdl/csdl-enum-type.d.ts +3 -3
- package/lib/metadata/csdl/csdl-function-action.d.ts +4 -4
- package/lib/metadata/csdl/csdl-reference.d.ts +2 -2
- package/lib/metadata/csdl/csdl-schema.d.ts +2 -2
- package/lib/metadata/csdl/csdl-structural-property.d.ts +3 -3
- package/lib/metadata/csdl/csdl-structured-type.d.ts +3 -3
- package/lib/metadata/metadata.d.ts +2 -2
- package/lib/models/options.d.ts +2 -2
- package/lib/module.d.ts +3 -3
- package/lib/options.d.ts +3 -3
- 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 +4 -3
- 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/handlers.d.ts +17 -5
- package/lib/resources/resource.d.ts +5 -5
- package/lib/resources/types/action.d.ts +2 -2
- package/lib/resources/types/entity-set.d.ts +2 -2
- package/lib/resources/types/navigation-property.d.ts +2 -2
- package/lib/resources/types/property.d.ts +2 -2
- 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 +2 -2
- package/lib/schema/parsers/callable.d.ts +4 -4
- package/lib/schema/parsers/enum-type.d.ts +3 -3
- package/lib/schema/parsers/structured-type.d.ts +4 -4
- package/lib/schema/schema.d.ts +3 -3
- package/lib/schema/singleton.d.ts +2 -2
- package/lib/schema/structured-type.d.ts +3 -3
- package/lib/services/entity.d.ts +1 -1
- package/lib/settings.d.ts +2 -2
- package/lib/types.d.ts +76 -74
- package/lib/utils/odata.d.ts +2 -2
- package/package.json +3 -5
- package/schematics/apigen/files/api-config/__fileName__.ts +4 -4
- package/esm2022/angular-odata.mjs +0 -5
- package/esm2022/lib/annotations.mjs +0 -146
- package/esm2022/lib/api.mjs +0 -439
- package/esm2022/lib/cache/cache.mjs +0 -177
- package/esm2022/lib/cache/index.mjs +0 -4
- package/esm2022/lib/cache/memory.mjs +0 -30
- package/esm2022/lib/cache/storage.mjs +0 -57
- package/esm2022/lib/client.mjs +0 -215
- package/esm2022/lib/constants.mjs +0 -95
- package/esm2022/lib/helper.mjs +0 -288
- package/esm2022/lib/index.mjs +0 -22
- package/esm2022/lib/loaders.mjs +0 -43
- package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -273
- package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -59
- package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -50
- package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -74
- package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -204
- package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -15
- package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -76
- package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -87
- package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -37
- package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -145
- package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -159
- package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -46
- package/esm2022/lib/metadata/index.mjs +0 -3
- package/esm2022/lib/metadata/metadata.mjs +0 -41
- package/esm2022/lib/metadata/parser.mjs +0 -564
- package/esm2022/lib/models/collection.mjs +0 -816
- package/esm2022/lib/models/index.mjs +0 -4
- package/esm2022/lib/models/model.mjs +0 -577
- package/esm2022/lib/models/options.mjs +0 -1227
- package/esm2022/lib/module.mjs +0 -55
- package/esm2022/lib/options.mjs +0 -91
- package/esm2022/lib/resources/index.mjs +0 -7
- package/esm2022/lib/resources/options.mjs +0 -66
- package/esm2022/lib/resources/path/handlers.mjs +0 -81
- package/esm2022/lib/resources/path/index.mjs +0 -3
- package/esm2022/lib/resources/path/segments.mjs +0 -149
- package/esm2022/lib/resources/query/builder.mjs +0 -645
- package/esm2022/lib/resources/query/expressions/apply.mjs +0 -238
- package/esm2022/lib/resources/query/expressions/base.mjs +0 -26
- package/esm2022/lib/resources/query/expressions/compute.mjs +0 -55
- package/esm2022/lib/resources/query/expressions/count.mjs +0 -118
- package/esm2022/lib/resources/query/expressions/expand.mjs +0 -154
- package/esm2022/lib/resources/query/expressions/filter.mjs +0 -180
- package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
- package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -81
- package/esm2022/lib/resources/query/expressions/search.mjs +0 -144
- package/esm2022/lib/resources/query/expressions/select.mjs +0 -49
- package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -770
- package/esm2022/lib/resources/query/handlers.mjs +0 -423
- package/esm2022/lib/resources/query/index.mjs +0 -5
- package/esm2022/lib/resources/query/options.mjs +0 -140
- package/esm2022/lib/resources/request.mjs +0 -210
- package/esm2022/lib/resources/resource.mjs +0 -316
- package/esm2022/lib/resources/response.mjs +0 -180
- package/esm2022/lib/resources/types/action.mjs +0 -118
- 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 -149
- 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 -246
- package/esm2022/lib/resources/types/options.mjs +0 -2
- package/esm2022/lib/resources/types/property.mjs +0 -187
- package/esm2022/lib/resources/types/reference.mjs +0 -87
- package/esm2022/lib/resources/types/singleton.mjs +0 -125
- package/esm2022/lib/resources/types/value.mjs +0 -48
- package/esm2022/lib/schema/annotation.mjs +0 -44
- package/esm2022/lib/schema/callable.mjs +0 -69
- package/esm2022/lib/schema/element.mjs +0 -70
- package/esm2022/lib/schema/entity-container.mjs +0 -13
- package/esm2022/lib/schema/entity-set.mjs +0 -11
- package/esm2022/lib/schema/enum-type.mjs +0 -69
- package/esm2022/lib/schema/index.mjs +0 -9
- package/esm2022/lib/schema/parsers/callable.mjs +0 -123
- package/esm2022/lib/schema/parsers/edm.mjs +0 -101
- package/esm2022/lib/schema/parsers/enum-type.mjs +0 -148
- package/esm2022/lib/schema/parsers/index.mjs +0 -5
- package/esm2022/lib/schema/parsers/structured-type.mjs +0 -548
- package/esm2022/lib/schema/schema.mjs +0 -52
- package/esm2022/lib/schema/singleton.mjs +0 -11
- package/esm2022/lib/schema/structured-type.mjs +0 -220
- package/esm2022/lib/services/base.mjs +0 -32
- package/esm2022/lib/services/entity-set.mjs +0 -161
- package/esm2022/lib/services/entity.mjs +0 -12
- package/esm2022/lib/services/factory.mjs +0 -39
- package/esm2022/lib/services/index.mjs +0 -5
- package/esm2022/lib/services/singleton.mjs +0 -55
- package/esm2022/lib/settings.mjs +0 -113
- 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
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { map } from 'rxjs/operators';
|
|
2
|
-
import { PathSegment } from '../../types';
|
|
3
|
-
import { ODataPathSegments } from '../path';
|
|
4
|
-
import { ODataResource } from '../resource';
|
|
5
|
-
export class ODataActionResource extends ODataResource {
|
|
6
|
-
//#region Factory
|
|
7
|
-
static factory(api, { path, outgoingType, incomingType, bindingType, segments, }) {
|
|
8
|
-
segments = segments ?? new ODataPathSegments();
|
|
9
|
-
const segment = segments.add(PathSegment.action, path);
|
|
10
|
-
if (outgoingType !== undefined) {
|
|
11
|
-
segment.outgoingType(outgoingType);
|
|
12
|
-
}
|
|
13
|
-
if (incomingType !== undefined) {
|
|
14
|
-
segment.incomingType(incomingType);
|
|
15
|
-
}
|
|
16
|
-
if (bindingType !== undefined) {
|
|
17
|
-
segment.bindingType(bindingType);
|
|
18
|
-
}
|
|
19
|
-
return new ODataActionResource(api, { segments });
|
|
20
|
-
}
|
|
21
|
-
static fromResource(resource, path) {
|
|
22
|
-
const baseType = resource.outgoingType();
|
|
23
|
-
const callable = resource.api.findCallable(path, baseType);
|
|
24
|
-
const outgoingType = callable?.type();
|
|
25
|
-
const bindingType = callable?.binding()?.type;
|
|
26
|
-
const incomingType = callable?.returnType();
|
|
27
|
-
const action = ODataActionResource.factory(resource.api, {
|
|
28
|
-
path,
|
|
29
|
-
outgoingType,
|
|
30
|
-
bindingType,
|
|
31
|
-
incomingType,
|
|
32
|
-
segments: resource.cloneSegments(),
|
|
33
|
-
});
|
|
34
|
-
// Switch entitySet to binding type if available
|
|
35
|
-
if (bindingType !== undefined && bindingType !== baseType) {
|
|
36
|
-
let entitySet = resource.api.findEntitySet(bindingType);
|
|
37
|
-
if (entitySet !== undefined) {
|
|
38
|
-
action.segment((s) => s.entitySet().path(entitySet.name));
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return action;
|
|
42
|
-
}
|
|
43
|
-
clone() {
|
|
44
|
-
return super.clone();
|
|
45
|
-
}
|
|
46
|
-
//#endregion
|
|
47
|
-
//#region Requests
|
|
48
|
-
post(params, options) {
|
|
49
|
-
return super.post(params, options);
|
|
50
|
-
}
|
|
51
|
-
call(params, options = {}) {
|
|
52
|
-
return this.clone().post(params, options);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Execute the action and return the result as a property
|
|
56
|
-
* @param params Parameters for the action
|
|
57
|
-
* @param options Options for the request
|
|
58
|
-
* @returns Observable of the result of the action
|
|
59
|
-
*/
|
|
60
|
-
callProperty(params, options = {}) {
|
|
61
|
-
return this.call(params, { responseType: 'property', ...options }).pipe(map(({ property }) => property));
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Execute the action and return the result as a entity
|
|
65
|
-
* @param params Parameters for the action
|
|
66
|
-
* @param options Options for the request
|
|
67
|
-
* @returns Observable of the result of the action
|
|
68
|
-
*/
|
|
69
|
-
callEntity(params, options = {}) {
|
|
70
|
-
return this.call(params, { responseType: 'entity', ...options }).pipe(map(({ entity }) => entity));
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Execute the action and return the result as a model
|
|
74
|
-
* @param params Parameters for the action
|
|
75
|
-
* @param options Options for the request
|
|
76
|
-
* @returns Observable of the result of the action
|
|
77
|
-
*/
|
|
78
|
-
callModel(params, options = {}) {
|
|
79
|
-
return this.call(params, { responseType: 'entity', ...options }).pipe(map(({ entity, annots }) => entity
|
|
80
|
-
? this.asModel(entity, { annots, ModelType: options?.ModelType })
|
|
81
|
-
: null));
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Execute the action and return the result as a entities
|
|
85
|
-
* @param params Parameters for the action
|
|
86
|
-
* @param options Options for the request
|
|
87
|
-
* @returns Observable of the result of the action
|
|
88
|
-
*/
|
|
89
|
-
callEntities(params, options = {}) {
|
|
90
|
-
return this.call(params, { responseType: 'entities', ...options }).pipe(map(({ entities }) => entities));
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Execute the action and return the result as a collection
|
|
94
|
-
* @param params Parameters for the action
|
|
95
|
-
* @param options Options for the request
|
|
96
|
-
* @returns Observable of the result of the action
|
|
97
|
-
*/
|
|
98
|
-
callCollection(params, options = {}) {
|
|
99
|
-
return this.call(params, { responseType: 'entities', ...options }).pipe(map(({ entities, annots }) => entities
|
|
100
|
-
? this.asCollection(entities, {
|
|
101
|
-
annots,
|
|
102
|
-
CollectionType: options?.CollectionType,
|
|
103
|
-
})
|
|
104
|
-
: null));
|
|
105
|
-
}
|
|
106
|
-
//#endregion
|
|
107
|
-
callArraybuffer(params, { alias, ...options } = {}) {
|
|
108
|
-
return this.call(params, {
|
|
109
|
-
responseType: 'arraybuffer',
|
|
110
|
-
alias,
|
|
111
|
-
...options,
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
callBlob(params, { alias, ...options } = {}) {
|
|
115
|
-
return this.call(params, { responseType: 'blob', alias, ...options });
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3Jlc291cmNlcy90eXBlcy9hY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFTNUMsTUFBTSxPQUFPLG1CQUEwQixTQUFRLGFBQWdCO0lBQzdELGlCQUFpQjtJQUNqQixNQUFNLENBQUMsT0FBTyxDQUNaLEdBQWEsRUFDYixFQUNFLElBQUksRUFDSixZQUFZLEVBQ1osWUFBWSxFQUNaLFdBQVcsRUFDWCxRQUFRLEdBT1Q7UUFFRCxRQUFRLEdBQUcsUUFBUSxJQUFJLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUUvQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDOUIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLG1CQUFtQixDQUFPLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFB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QyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVEsQ0FDTixNQUFnQixFQUNoQixFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sS0FBeUMsRUFBRTtRQUU5RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9EYXRhQXBpIH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCB7IE9EYXRhQ29sbGVjdGlvbiwgT0RhdGFNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBQYXRoU2VnbWVudCB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IE9EYXRhUGF0aFNlZ21lbnRzIH0gZnJvbSAnLi4vcGF0aCc7XG5pbXBvcnQgeyBPRGF0YVJlc291cmNlIH0gZnJvbSAnLi4vcmVzb3VyY2UnO1xuaW1wb3J0IHtcbiAgT0RhdGFFbnRpdGllc09wdGlvbnMsXG4gIE9EYXRhRW50aXR5T3B0aW9ucyxcbiAgT0RhdGFPcHRpb25zLFxuICBPRGF0YVByb3BlcnR5T3B0aW9ucyxcbn0gZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IE9EYXRhRW50aXRpZXMsIE9EYXRhRW50aXR5LCBPRGF0YVByb3BlcnR5IH0gZnJvbSAnLi4vcmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgT0RhdGFBY3Rpb25SZXNvdXJjZTxQLCBSPiBleHRlbmRzIE9EYXRhUmVzb3VyY2U8Uj4ge1xuICAvLyNyZWdpb24gRmFjdG9yeVxuICBzdGF0aWMgZmFjdG9yeTxQLCBSPihcbiAgICBhcGk6IE9EYXRhQXBpLFxuICAgIHtcbiAgICAgIHBhdGgsXG4gICAgICBvdXRnb2luZ1R5cGUsXG4gICAgICBpbmNvbWluZ1R5cGUsXG4gICAgICBiaW5kaW5nVHlwZSxcbiAgICAgIHNlZ21lbnRzLFxuICAgIH06IHtcbiAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgIG91dGdvaW5nVHlwZT86IHN0cmluZztcbiAgICAgIGluY29taW5nVHlwZT86IHN0cmluZztcbiAgICAgIGJpbmRpbmdUeXBlPzogc3RyaW5nO1xuICAgICAgc2VnbWVudHM/OiBPRGF0YVBhdGhTZWdtZW50cztcbiAgICB9LFxuICApIHtcbiAgICBzZWdtZW50cyA9IHNlZ21lbnRzID8/IG5ldyBPRGF0YVBhdGhTZWdtZW50cygpO1xuXG4gICAgY29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzLmFkZChQYXRoU2VnbWVudC5hY3Rpb24sIHBhdGgpO1xuICAgIGlmIChvdXRnb2luZ1R5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VnbWVudC5vdXRnb2luZ1R5cGUob3V0Z29pbmdUeXBlKTtcbiAgICB9XG4gICAgaWYgKGluY29taW5nVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZWdtZW50LmluY29taW5nVHlwZShpbmNvbWluZ1R5cGUpO1xuICAgIH1cbiAgICBpZiAoYmluZGluZ1R5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VnbWVudC5iaW5kaW5nVHlwZShiaW5kaW5nVHlwZSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgT0RhdGFBY3Rpb25SZXNvdXJjZTxQLCBSPihhcGksIHsgc2VnbWVudHMgfSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbVJlc291cmNlPFAsIFI+KHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sIHBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IGJhc2VUeXBlID0gcmVzb3VyY2Uub3V0Z29pbmdUeXBlKCk7XG4gICAgY29uc3QgY2FsbGFibGUgPSByZXNvdXJjZS5hcGkuZmluZENhbGxhYmxlPFI+KHBhdGgsIGJhc2VUeXBlKTtcblxuICAgIGNvbnN0IG91dGdvaW5nVHlwZSA9IGNhbGxhYmxlPy50eXBlKCk7XG4gICAgY29uc3QgYmluZGluZ1R5cGUgPSBjYWxsYWJsZT8uYmluZGluZygpPy50eXBlO1xuICAgIGNvbnN0IGluY29taW5nVHlwZSA9IGNhbGxhYmxlPy5yZXR1cm5UeXBlKCk7XG5cbiAgICBjb25zdCBhY3Rpb24gPSBPRGF0YUFjdGlvblJlc291cmNlLmZhY3Rvcnk8UCwgUj4ocmVzb3VyY2UuYXBpLCB7XG4gICAgICBwYXRoLFxuICAgICAgb3V0Z29pbmdUeXBlLFxuICAgICAgYmluZGluZ1R5cGUsXG4gICAgICBpbmNvbWluZ1R5cGUsXG4gICAgICBzZWdtZW50czogcmVzb3VyY2UuY2xvbmVTZWdtZW50cygpLFxuICAgIH0pO1xuXG4gICAgLy8gU3dpdGNoIGVudGl0eVNldCB0byBiaW5kaW5nIHR5cGUgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWQgJiYgYmluZGluZ1R5cGUgIT09IGJhc2VUeXBlKSB7XG4gICAgICBsZXQgZW50aXR5U2V0ID0gcmVzb3VyY2UuYXBpLmZpbmRFbnRpdHlTZXQoYmluZGluZ1R5cGUpO1xuICAgICAgaWYgKGVudGl0eVNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjdGlvbi5zZWdtZW50KChzKSA9PiBzLmVudGl0eVNldCgpLnBhdGgoZW50aXR5U2V0IS5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IE9EYXRhQWN0aW9uUmVzb3VyY2U8UCwgUj4ge1xuICAgIHJldHVybiBzdXBlci5jbG9uZSgpIGFzIE9EYXRhQWN0aW9uUmVzb3VyY2U8UCwgUj47XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFJlcXVlc3RzXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwb3N0KFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IE9EYXRhRW50aXR5T3B0aW9ucyAmIE9EYXRhRW50aXRpZXNPcHRpb25zICYgT0RhdGFQcm9wZXJ0eU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHN1cGVyLnBvc3QocGFyYW1zLCBvcHRpb25zKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gU2hvcnRjdXRzXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIHRvIGJlIHNlbnQgdG8gdGhlIGFjdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVxdWVzdFxuICAgKi9cbiAgY2FsbChcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIG9wdGlvbnM/OiBPRGF0YUVudGl0eU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8T0RhdGFFbnRpdHk8Uj4+O1xuICBjYWxsKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IE9EYXRhRW50aXRpZXNPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPE9EYXRhRW50aXRpZXM8Uj4+O1xuICBjYWxsKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IE9EYXRhUHJvcGVydHlPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUHJvcGVydHk8Uj4+O1xuICBjYWxsKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgb3B0aW9ucz86IHsgYWxpYXM/OiBib29sZWFuOyByZXNwb25zZVR5cGU/OiAnYmxvYicgfSAmIE9EYXRhT3B0aW9ucyxcbiAgKTogT2JzZXJ2YWJsZTxCbG9iPjtcbiAgY2FsbChcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIG9wdGlvbnM/OiB7IGFsaWFzPzogYm9vbGVhbjsgcmVzcG9uc2VUeXBlPzogJ2FycmF5YnVmZmVyJyB9ICYgT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPjtcbiAgY2FsbChcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIG9wdGlvbnM/OiB7IGFsaWFzPzogYm9vbGVhbjsgcmVzcG9uc2VUeXBlPzogJ25vbmUnIH0gJiBPRGF0YU9wdGlvbnMsXG4gICk6IE9ic2VydmFibGU8bnVsbD47XG4gIGNhbGwoXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICBvcHRpb25zOiBPRGF0YUVudGl0eU9wdGlvbnMgJlxuICAgICAgT0RhdGFFbnRpdGllc09wdGlvbnMgJlxuICAgICAgT0RhdGFQcm9wZXJ0eU9wdGlvbnMgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLnBvc3QocGFyYW1zLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBhY3Rpb24gYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGEgcHJvcGVydHlcbiAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgYWN0aW9uXG4gICAqL1xuICBjYWxsUHJvcGVydHkocGFyYW1zOiBQIHwgbnVsbCwgb3B0aW9uczogT0RhdGFPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScsIC4uLm9wdGlvbnMgfSkucGlwZShcbiAgICAgIG1hcCgoeyBwcm9wZXJ0eSB9KSA9PiBwcm9wZXJ0eSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBhY3Rpb24gYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGEgZW50aXR5XG4gICAqIEBwYXJhbSBwYXJhbXMgUGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHRoZSByZXN1bHQgb2YgdGhlIGFjdGlvblxuICAgKi9cbiAgY2FsbEVudGl0eShwYXJhbXM6IFAgfCBudWxsLCBvcHRpb25zOiBPRGF0YU9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiB0aGlzLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZTogJ2VudGl0eScsIC4uLm9wdGlvbnMgfSkucGlwZShcbiAgICAgIG1hcCgoeyBlbnRpdHkgfSkgPT4gZW50aXR5KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIGFjdGlvbiBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSBtb2RlbFxuICAgKiBAcGFyYW0gcGFyYW1zIFBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHJlcXVlc3RcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiB0aGUgcmVzdWx0IG9mIHRoZSBhY3Rpb25cbiAgICovXG4gIGNhbGxNb2RlbChcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHsgTW9kZWxUeXBlPzogdHlwZW9mIE9EYXRhTW9kZWwgfSA9IHt9LFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGU6ICdlbnRpdHknLCAuLi5vcHRpb25zIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXR5LCBhbm5vdHMgfSkgPT5cbiAgICAgICAgZW50aXR5XG4gICAgICAgICAgPyB0aGlzLmFzTW9kZWwoZW50aXR5LCB7IGFubm90cywgTW9kZWxUeXBlOiBvcHRpb25zPy5Nb2RlbFR5cGUgfSlcbiAgICAgICAgICA6IG51bGwsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgYWN0aW9uIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhIGVudGl0aWVzXG4gICAqIEBwYXJhbSBwYXJhbXMgUGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIHRoZSByZXN1bHQgb2YgdGhlIGFjdGlvblxuICAgKi9cbiAgY2FsbEVudGl0aWVzKHBhcmFtczogUCB8IG51bGwsIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlOiAnZW50aXRpZXMnLCAuLi5vcHRpb25zIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXRpZXMgfSkgPT4gZW50aXRpZXMpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgYWN0aW9uIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgYWN0aW9uXG4gICAqL1xuICBjYWxsQ29sbGVjdGlvbihcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHsgQ29sbGVjdGlvblR5cGU/OiB0eXBlb2YgT0RhdGFDb2xsZWN0aW9uIH0gPSB7fSxcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlOiAnZW50aXRpZXMnLCAuLi5vcHRpb25zIH0pLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXRpZXMsIGFubm90cyB9KSA9PlxuICAgICAgICBlbnRpdGllc1xuICAgICAgICAgID8gdGhpcy5hc0NvbGxlY3Rpb24oZW50aXRpZXMsIHtcbiAgICAgICAgICAgICAgYW5ub3RzLFxuICAgICAgICAgICAgICBDb2xsZWN0aW9uVHlwZTogb3B0aW9ucz8uQ29sbGVjdGlvblR5cGUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogbnVsbCxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBjYWxsQXJyYXlidWZmZXIoXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICB7IGFsaWFzLCAuLi5vcHRpb25zIH06IHsgYWxpYXM/OiBib29sZWFuIH0gJiBPRGF0YU9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbChwYXJhbXMsIHtcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgICAgIGFsaWFzLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNhbGxCbG9iKFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgeyBhbGlhcywgLi4ub3B0aW9ucyB9OiB7IGFsaWFzPzogYm9vbGVhbiB9ICYgT0RhdGFPcHRpb25zID0ge30sXG4gICkge1xuICAgIHJldHVybiB0aGlzLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InLCBhbGlhcywgLi4ub3B0aW9ucyB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1,428 +0,0 @@
|
|
|
1
|
-
import { HttpErrorResponse, HttpHeaders, HttpResponse, } from '@angular/common/http';
|
|
2
|
-
import { map, Subject } from 'rxjs';
|
|
3
|
-
import { $BATCH, ACCEPT, APPLICATION_HTTP, APPLICATION_JSON, BATCH_PREFIX, BINARY, BOUNDARY_PREFIX_SUFFIX, CHANGESET_PREFIX, CONTENT_ID, CONTENT_TRANSFER_ENCODING, CONTENT_TYPE, HTTP11, MULTIPART_MIXED, MULTIPART_MIXED_BOUNDARY, NEWLINE, NEWLINE_REGEXP, ODATA_VERSION, VERSION_4_0, XSSI_PREFIX, } from '../../constants';
|
|
4
|
-
import { PathSegment } from '../../types';
|
|
5
|
-
import { Arrays } from '../../utils/arrays';
|
|
6
|
-
import { Http } from '../../utils/http';
|
|
7
|
-
import { Strings } from '../../utils/strings';
|
|
8
|
-
import { ODataPathSegments } from '../path';
|
|
9
|
-
import { ODataResource } from '../resource';
|
|
10
|
-
export class ODataBatchRequest extends Subject {
|
|
11
|
-
request;
|
|
12
|
-
id;
|
|
13
|
-
group;
|
|
14
|
-
constructor(request) {
|
|
15
|
-
super();
|
|
16
|
-
this.request = request;
|
|
17
|
-
this.id = Strings.uniqueId({ prefix: 'r' });
|
|
18
|
-
this.group = Strings.uniqueId({ prefix: 'g' });
|
|
19
|
-
}
|
|
20
|
-
toString() {
|
|
21
|
-
return this.toLegacy();
|
|
22
|
-
}
|
|
23
|
-
toLegacy({ relativeUrls } = {}) {
|
|
24
|
-
//TODO: Relative or Absolute url ?
|
|
25
|
-
let res = [
|
|
26
|
-
`${this.request.method} ${relativeUrls ? this.request.pathWithParams : this.request.urlWithParams} ${HTTP11}`,
|
|
27
|
-
];
|
|
28
|
-
if (this.request.method === 'POST' ||
|
|
29
|
-
this.request.method === 'PATCH' ||
|
|
30
|
-
this.request.method === 'PUT') {
|
|
31
|
-
res.push(`${CONTENT_TYPE}: ${APPLICATION_JSON}`);
|
|
32
|
-
}
|
|
33
|
-
if (this.request.headers instanceof HttpHeaders) {
|
|
34
|
-
let headers = this.request.headers;
|
|
35
|
-
res = [
|
|
36
|
-
...res,
|
|
37
|
-
...headers
|
|
38
|
-
.keys()
|
|
39
|
-
.map((key) => `${key}: ${(headers.getAll(key) || []).join(',')}`),
|
|
40
|
-
];
|
|
41
|
-
}
|
|
42
|
-
if (this.request.method === 'GET' || this.request.method === 'DELETE') {
|
|
43
|
-
res.push(NEWLINE);
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
res.push(`${NEWLINE}${JSON.stringify(this.request.body)}`);
|
|
47
|
-
}
|
|
48
|
-
return res.join(NEWLINE);
|
|
49
|
-
}
|
|
50
|
-
toJson({ relativeUrls } = {}) {
|
|
51
|
-
let res = {
|
|
52
|
-
id: this.id,
|
|
53
|
-
method: this.request.method,
|
|
54
|
-
url: relativeUrls
|
|
55
|
-
? this.request.pathWithParams
|
|
56
|
-
: this.request.urlWithParams,
|
|
57
|
-
//'atomicityGroup': this.group
|
|
58
|
-
//"dependsOn": ["g1", "g2", "r2"]
|
|
59
|
-
};
|
|
60
|
-
if (this.request.headers instanceof HttpHeaders) {
|
|
61
|
-
let headers = this.request.headers;
|
|
62
|
-
res['headers'] = headers
|
|
63
|
-
.keys()
|
|
64
|
-
.map((key) => `${key}: ${(headers.getAll(key) || []).join(',')}`);
|
|
65
|
-
}
|
|
66
|
-
if (!(this.request.method === 'GET' || this.request.method === 'DELETE')) {
|
|
67
|
-
res['body'] = this.request.body;
|
|
68
|
-
}
|
|
69
|
-
return res;
|
|
70
|
-
}
|
|
71
|
-
onLoad(response) {
|
|
72
|
-
if (response.ok) {
|
|
73
|
-
this.next(response);
|
|
74
|
-
this.complete();
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
// An unsuccessful request is delivered on the error channel.
|
|
78
|
-
this.error(response);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
onError(response) {
|
|
82
|
-
this.error(response);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* OData Batch Resource
|
|
87
|
-
* https://www.odata.org/getting-started/advanced-tutorial/#batch
|
|
88
|
-
*/
|
|
89
|
-
export class ODataBatchResource extends ODataResource {
|
|
90
|
-
// VARIABLES
|
|
91
|
-
_requests = [];
|
|
92
|
-
requests() {
|
|
93
|
-
return this._requests.map((r) => r.request);
|
|
94
|
-
}
|
|
95
|
-
_responses = null;
|
|
96
|
-
responses() {
|
|
97
|
-
return this._responses;
|
|
98
|
-
}
|
|
99
|
-
//#region Factory
|
|
100
|
-
static factory(api) {
|
|
101
|
-
let segments = new ODataPathSegments();
|
|
102
|
-
segments.add(PathSegment.batch, $BATCH);
|
|
103
|
-
return new ODataBatchResource(api, { segments });
|
|
104
|
-
}
|
|
105
|
-
clone() {
|
|
106
|
-
const batch = super.clone();
|
|
107
|
-
batch._requests = [...this._requests];
|
|
108
|
-
return batch;
|
|
109
|
-
}
|
|
110
|
-
//#endregion
|
|
111
|
-
storeRequester() {
|
|
112
|
-
const current = this.api.requester;
|
|
113
|
-
// Switch to the batch requester
|
|
114
|
-
this.api.requester = (req) => {
|
|
115
|
-
if (req.api !== this.api)
|
|
116
|
-
throw new Error('Batch Request are for the same api.');
|
|
117
|
-
if (req.observe === 'events')
|
|
118
|
-
throw new Error("Batch Request does not allows observe == 'events'.");
|
|
119
|
-
this._requests.push(new ODataBatchRequest(req));
|
|
120
|
-
return this._requests[this._requests.length - 1];
|
|
121
|
-
};
|
|
122
|
-
return current;
|
|
123
|
-
}
|
|
124
|
-
restoreRequester(handler) {
|
|
125
|
-
this.api.requester = handler;
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Add to batch request
|
|
129
|
-
* @param ctx The context for the request
|
|
130
|
-
* @returns The result of execute the context
|
|
131
|
-
*/
|
|
132
|
-
add(ctx) {
|
|
133
|
-
// Store original requester
|
|
134
|
-
var handler = this.storeRequester();
|
|
135
|
-
// Execute the context
|
|
136
|
-
const result = ctx(this);
|
|
137
|
-
// Restore original requester
|
|
138
|
-
this.restoreRequester(handler);
|
|
139
|
-
return result;
|
|
140
|
-
}
|
|
141
|
-
send(options) {
|
|
142
|
-
if (this.api.options.jsonBatchFormat) {
|
|
143
|
-
return this.sendJson(options);
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
return this.sendLegacy(options);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
sendJson(options) {
|
|
150
|
-
const headers = Http.mergeHttpHeaders((options && options.headers) || {}, {
|
|
151
|
-
[ODATA_VERSION]: VERSION_4_0,
|
|
152
|
-
});
|
|
153
|
-
return this.api
|
|
154
|
-
.request('POST', this, {
|
|
155
|
-
body: ODataBatchResource.buildJsonBody(this._requests, this.api.options),
|
|
156
|
-
responseType: 'json',
|
|
157
|
-
observe: 'response',
|
|
158
|
-
headers: headers,
|
|
159
|
-
params: options ? options.params : undefined,
|
|
160
|
-
withCredentials: options ? options.withCredentials : undefined,
|
|
161
|
-
})
|
|
162
|
-
.pipe(map((response) => {
|
|
163
|
-
if (this._responses == null) {
|
|
164
|
-
this._responses = [];
|
|
165
|
-
}
|
|
166
|
-
this._responses = [
|
|
167
|
-
...this._responses,
|
|
168
|
-
...ODataBatchResource.parseJsonResponse(this._requests, response),
|
|
169
|
-
];
|
|
170
|
-
//HACK: tuple[1] === undefined
|
|
171
|
-
Arrays.zip(this._requests, this._responses).forEach((tuple) => {
|
|
172
|
-
if (!tuple[0].isStopped && tuple[1])
|
|
173
|
-
tuple[0].onLoad(tuple[1]);
|
|
174
|
-
});
|
|
175
|
-
return response;
|
|
176
|
-
}));
|
|
177
|
-
}
|
|
178
|
-
sendLegacy(options) {
|
|
179
|
-
const bound = Strings.uniqueId({ prefix: BATCH_PREFIX });
|
|
180
|
-
const headers = Http.mergeHttpHeaders((options && options.headers) || {}, {
|
|
181
|
-
[ODATA_VERSION]: VERSION_4_0,
|
|
182
|
-
[CONTENT_TYPE]: MULTIPART_MIXED_BOUNDARY + bound,
|
|
183
|
-
[ACCEPT]: MULTIPART_MIXED,
|
|
184
|
-
});
|
|
185
|
-
return this.api
|
|
186
|
-
.request('POST', this, {
|
|
187
|
-
body: ODataBatchResource.buildLegacyBody(bound, this._requests, this.api.options),
|
|
188
|
-
responseType: 'text',
|
|
189
|
-
observe: 'response',
|
|
190
|
-
headers: headers,
|
|
191
|
-
params: options ? options.params : undefined,
|
|
192
|
-
withCredentials: options ? options.withCredentials : undefined,
|
|
193
|
-
})
|
|
194
|
-
.pipe(map((response) => {
|
|
195
|
-
if (this._responses == null) {
|
|
196
|
-
this._responses = [];
|
|
197
|
-
}
|
|
198
|
-
this._responses = [
|
|
199
|
-
...this._responses,
|
|
200
|
-
...ODataBatchResource.parseLegacyResponse(this._requests, response),
|
|
201
|
-
];
|
|
202
|
-
Arrays.zip(this._requests, this._responses).forEach((tuple) => {
|
|
203
|
-
if (!tuple[0].isStopped && tuple[1])
|
|
204
|
-
tuple[0].onLoad(tuple[1]);
|
|
205
|
-
});
|
|
206
|
-
return response;
|
|
207
|
-
}));
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Execute the batch request
|
|
211
|
-
* @param ctx The context for the request
|
|
212
|
-
* @param options The options of the batch request
|
|
213
|
-
* @returns The result of execute the context
|
|
214
|
-
*/
|
|
215
|
-
exec(ctx, options) {
|
|
216
|
-
let result = this.add(ctx);
|
|
217
|
-
return this.send(options).pipe(map((response) => [result, response]));
|
|
218
|
-
}
|
|
219
|
-
body() {
|
|
220
|
-
return ODataBatchResource.buildLegacyBody(Strings.uniqueId({ prefix: BATCH_PREFIX }), this._requests, this.api.options);
|
|
221
|
-
}
|
|
222
|
-
json() {
|
|
223
|
-
return ODataBatchResource.buildJsonBody(this._requests, this.api.options);
|
|
224
|
-
}
|
|
225
|
-
static buildLegacyBody(batchBoundary, requests, options) {
|
|
226
|
-
let res = [];
|
|
227
|
-
let changesetBoundary = null;
|
|
228
|
-
let changesetId = 1;
|
|
229
|
-
for (const request of requests) {
|
|
230
|
-
// if method is GET and there is a changeset boundary open then close it
|
|
231
|
-
if (request.request.method === 'GET' && changesetBoundary !== null) {
|
|
232
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${changesetBoundary}${BOUNDARY_PREFIX_SUFFIX}`);
|
|
233
|
-
changesetBoundary = null;
|
|
234
|
-
}
|
|
235
|
-
// if there is no changeset boundary open then open a batch boundary
|
|
236
|
-
if (changesetBoundary === null) {
|
|
237
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${batchBoundary}`);
|
|
238
|
-
}
|
|
239
|
-
// if method is not GET and there is no changeset boundary open then open a changeset boundary
|
|
240
|
-
if (request.request.method !== 'GET') {
|
|
241
|
-
if (changesetBoundary === null) {
|
|
242
|
-
changesetBoundary = Strings.uniqueId({ prefix: CHANGESET_PREFIX });
|
|
243
|
-
res.push(`${CONTENT_TYPE}: ${MULTIPART_MIXED_BOUNDARY}${changesetBoundary}`);
|
|
244
|
-
res.push(NEWLINE);
|
|
245
|
-
}
|
|
246
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${changesetBoundary}`);
|
|
247
|
-
}
|
|
248
|
-
res.push(`${CONTENT_TYPE}: ${APPLICATION_HTTP}`);
|
|
249
|
-
res.push(`${CONTENT_TRANSFER_ENCODING}: ${BINARY}`);
|
|
250
|
-
if (request.request.method !== 'GET') {
|
|
251
|
-
res.push(`${CONTENT_ID}: ${changesetId++}`);
|
|
252
|
-
}
|
|
253
|
-
res.push(NEWLINE);
|
|
254
|
-
res.push(`${request.toLegacy(options)}`);
|
|
255
|
-
}
|
|
256
|
-
if (res.length) {
|
|
257
|
-
if (changesetBoundary !== null) {
|
|
258
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${changesetBoundary}${BOUNDARY_PREFIX_SUFFIX}`);
|
|
259
|
-
changesetBoundary = null;
|
|
260
|
-
}
|
|
261
|
-
res.push(`${BOUNDARY_PREFIX_SUFFIX}${batchBoundary}${BOUNDARY_PREFIX_SUFFIX}`);
|
|
262
|
-
}
|
|
263
|
-
return res.join(NEWLINE);
|
|
264
|
-
}
|
|
265
|
-
static buildJsonBody(requests, options) {
|
|
266
|
-
return {
|
|
267
|
-
requests: requests.map((request) => request.toJson(options)),
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
static parseLegacyResponse(requests, response) {
|
|
271
|
-
let chunks = [];
|
|
272
|
-
const contentType = response.headers.get(CONTENT_TYPE) || '';
|
|
273
|
-
const batchBoundary = Http.boundaryDelimiter(contentType);
|
|
274
|
-
const endLine = Http.boundaryEnd(batchBoundary);
|
|
275
|
-
const lines = (response.body || '').split(NEWLINE_REGEXP);
|
|
276
|
-
let changesetResponses = null;
|
|
277
|
-
let contentId = null;
|
|
278
|
-
let changesetBoundary = null;
|
|
279
|
-
let changesetEndLine = null;
|
|
280
|
-
let startIndex = null;
|
|
281
|
-
for (let index = 0; index < lines.length; index++) {
|
|
282
|
-
const line = lines[index];
|
|
283
|
-
if (line.startsWith(CONTENT_TYPE)) {
|
|
284
|
-
const contentTypeValue = Http.headerValue(line);
|
|
285
|
-
if (contentTypeValue === MULTIPART_MIXED) {
|
|
286
|
-
changesetResponses = [];
|
|
287
|
-
contentId = null;
|
|
288
|
-
changesetBoundary = Http.boundaryDelimiter(line);
|
|
289
|
-
changesetEndLine = Http.boundaryEnd(changesetBoundary);
|
|
290
|
-
startIndex = null;
|
|
291
|
-
}
|
|
292
|
-
continue;
|
|
293
|
-
}
|
|
294
|
-
else if (changesetResponses !== null && line.startsWith(CONTENT_ID)) {
|
|
295
|
-
contentId = Number(Http.headerValue(line));
|
|
296
|
-
}
|
|
297
|
-
else if (line.startsWith(HTTP11)) {
|
|
298
|
-
startIndex = index;
|
|
299
|
-
}
|
|
300
|
-
else if (line === batchBoundary ||
|
|
301
|
-
line === changesetBoundary ||
|
|
302
|
-
line === endLine ||
|
|
303
|
-
line === changesetEndLine) {
|
|
304
|
-
if (!startIndex) {
|
|
305
|
-
continue;
|
|
306
|
-
}
|
|
307
|
-
const chunk = lines.slice(startIndex, index);
|
|
308
|
-
if (changesetResponses !== null && contentId !== null) {
|
|
309
|
-
changesetResponses[contentId] = chunk;
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
chunks.push(chunk);
|
|
313
|
-
}
|
|
314
|
-
if (line === batchBoundary || line === changesetBoundary) {
|
|
315
|
-
startIndex = index + 1;
|
|
316
|
-
}
|
|
317
|
-
else if (line === endLine || line === changesetEndLine) {
|
|
318
|
-
if (changesetResponses !== null) {
|
|
319
|
-
for (const response of changesetResponses) {
|
|
320
|
-
if (response) {
|
|
321
|
-
chunks.push(response);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
changesetResponses = null;
|
|
326
|
-
changesetBoundary = null;
|
|
327
|
-
changesetEndLine = null;
|
|
328
|
-
startIndex = null;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
return chunks.map((chunk, index) => {
|
|
333
|
-
let request = requests[index].request;
|
|
334
|
-
let { code, message } = Http.parseResponseStatus(chunk[0]);
|
|
335
|
-
chunk = chunk.slice(1);
|
|
336
|
-
let headers = new HttpHeaders();
|
|
337
|
-
var index = 1;
|
|
338
|
-
for (; index < chunk.length; index++) {
|
|
339
|
-
const batchBodyLine = chunk[index];
|
|
340
|
-
if (batchBodyLine === '') {
|
|
341
|
-
break;
|
|
342
|
-
}
|
|
343
|
-
const batchBodyLineParts = batchBodyLine.split(': ');
|
|
344
|
-
headers = headers.append(batchBodyLineParts[0].trim(), batchBodyLineParts[1].trim());
|
|
345
|
-
}
|
|
346
|
-
let body = '';
|
|
347
|
-
for (; index < chunk.length; index++) {
|
|
348
|
-
body += chunk[index];
|
|
349
|
-
}
|
|
350
|
-
if (code === 0) {
|
|
351
|
-
code = !!body ? 200 : 0;
|
|
352
|
-
}
|
|
353
|
-
let ok = code >= 200 && code < 300;
|
|
354
|
-
if (request.responseType === 'json' && typeof body === 'string') {
|
|
355
|
-
const originalBody = body;
|
|
356
|
-
body = body.replace(XSSI_PREFIX, '');
|
|
357
|
-
try {
|
|
358
|
-
body = body !== '' ? JSON.parse(body) : null;
|
|
359
|
-
}
|
|
360
|
-
catch (error) {
|
|
361
|
-
body = originalBody;
|
|
362
|
-
if (ok) {
|
|
363
|
-
ok = false;
|
|
364
|
-
body = { error, text: body };
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
return ok
|
|
369
|
-
? new HttpResponse({
|
|
370
|
-
body,
|
|
371
|
-
headers,
|
|
372
|
-
status: code,
|
|
373
|
-
statusText: message,
|
|
374
|
-
url: request.urlWithParams,
|
|
375
|
-
})
|
|
376
|
-
: new HttpErrorResponse({
|
|
377
|
-
// The error in this case is the response body (error from the server).
|
|
378
|
-
error: body,
|
|
379
|
-
headers,
|
|
380
|
-
status: code,
|
|
381
|
-
statusText: message,
|
|
382
|
-
url: request.urlWithParams,
|
|
383
|
-
});
|
|
384
|
-
});
|
|
385
|
-
}
|
|
386
|
-
static parseJsonResponse(requests, response) {
|
|
387
|
-
const responses = (response.body ? response.body : {})['responses'] ?? [];
|
|
388
|
-
return responses.map((response, index) => {
|
|
389
|
-
let request = requests[index].request;
|
|
390
|
-
let code = response['status'];
|
|
391
|
-
let headers = new HttpHeaders(response['headers']);
|
|
392
|
-
let body = response['body'];
|
|
393
|
-
if (code === 0) {
|
|
394
|
-
code = !!body ? 200 : 0;
|
|
395
|
-
}
|
|
396
|
-
let ok = code >= 200 && code < 300;
|
|
397
|
-
if (request.responseType === 'json' && typeof body === 'string') {
|
|
398
|
-
const originalBody = body;
|
|
399
|
-
body = body.replace(XSSI_PREFIX, '');
|
|
400
|
-
try {
|
|
401
|
-
body = body !== '' ? JSON.parse(body) : null;
|
|
402
|
-
}
|
|
403
|
-
catch (error) {
|
|
404
|
-
body = originalBody;
|
|
405
|
-
if (ok) {
|
|
406
|
-
ok = false;
|
|
407
|
-
body = { error, text: body };
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
return ok
|
|
412
|
-
? new HttpResponse({
|
|
413
|
-
body,
|
|
414
|
-
headers,
|
|
415
|
-
status: code,
|
|
416
|
-
url: request.urlWithParams,
|
|
417
|
-
})
|
|
418
|
-
: new HttpErrorResponse({
|
|
419
|
-
// The error in this case is the response body (error from the server).
|
|
420
|
-
error: body,
|
|
421
|
-
headers,
|
|
422
|
-
status: code,
|
|
423
|
-
url: request.urlWithParams,
|
|
424
|
-
});
|
|
425
|
-
});
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3R5cGVzL2JhdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsV0FBVyxFQUNYLFlBQVksR0FFYixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFDTCxNQUFNLEVBQ04sTUFBTSxFQUNOLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLE1BQU0sRUFDTixzQkFBc0IsRUFDdEIsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsWUFBWSxFQUNaLE1BQU0sRUFDTixlQUFlLEVBQ2Ysd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxjQUFjLEVBQ2QsYUFBYSxFQUNiLFdBQVcsRUFDWCxXQUFXLEdBQ1osTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSzVDLE1BQU0sT0FBTyxpQkFBcUIsU0FBUSxPQUF5QjtJQUc5QztJQUZuQixFQUFFLENBQVM7SUFDWCxLQUFLLENBQVM7SUFDZCxZQUFtQixPQUEwQjtRQUMzQyxLQUFLLEVBQUUsQ0FBQztRQURTLFlBQU8sR0FBUCxPQUFPLENB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QUFDO1lBQ25DLElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxNQUFNLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2hFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDMUIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUM7b0JBQ0gsSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDL0MsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLElBQUksR0FBRyxZQUFZLENBQUM7b0JBRXBCLElBQUksRUFBRSxFQUFFLENBQUM7d0JBQ1AsRUFBRSxHQUFHLEtBQUssQ0FBQzt3QkFDWCxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO29CQUMvQixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxFQUFFO2dCQUNQLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBTTtvQkFDcEIsSUFBSTtvQkFDSixPQUFPO29CQUNQLE1BQU0sRUFBRSxJQUFJO29CQUNaLEdBQUcsRUFBRSxPQUFPLENBQUMsYUFBYTtpQkFDM0IsQ0FBQztnQkFDSixDQUFDLENBQUMsSUFBSSxpQkFBaUIsQ0FBQztvQkFDcEIsdUVBQXVFO29CQUN2RSxLQUFLLEVBQUUsSUFBSTtvQkFDWCxPQUFPO29CQUNQLE1BQU0sRUFBRSxJQUFJO29CQUNaLEdBQUcsRUFBRSxPQUFPLENBQUMsYUFBYTtpQkFDM0IsQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBIdHRwRXJyb3JSZXNwb25zZSxcbiAgSHR0cEhlYWRlcnMsXG4gIEh0dHBSZXNwb25zZSxcbiAgSHR0cFJlc3BvbnNlQmFzZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPRGF0YUFwaSB9IGZyb20gJy4uLy4uL2FwaSc7XG5pbXBvcnQge1xuICAkQkFUQ0gsXG4gIEFDQ0VQVCxcbiAgQVBQTElDQVRJT05fSFRUUCxcbiAgQVBQTElDQVRJT05fSlNPTixcbiAgQkFUQ0hfUFJFRklYLFxuICBCSU5BUlksXG4gIEJPVU5EQVJZX1BSRUZJWF9TVUZGSVgsXG4gIENIQU5HRVNFVF9QUkVGSVgsXG4gIENPTlRFTlRfSUQsXG4gIENPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkcsXG4gIENPTlRFTlRfVFlQRSxcbiAgSFRUUDExLFxuICBNVUxUSVBBUlRfTUlYRUQsXG4gIE1VTFRJUEFSVF9NSVhFRF9CT1VOREFSWSxcbiAgTkVXTElORSxcbiAgTkVXTElORV9SRUdFWFAsXG4gIE9EQVRBX1ZFUlNJT04sXG4gIFZFUlNJT05fNF8wLFxuICBYU1NJX1BSRUZJWCxcbn0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFBhdGhTZWdtZW50IH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQXJyYXlzIH0gZnJvbSAnLi4vLi4vdXRpbHMvYXJyYXlzJztcbmltcG9ydCB7IEh0dHAgfSBmcm9tICcuLi8uLi91dGlscy9odHRwJztcbmltcG9ydCB7IFN0cmluZ3MgfSBmcm9tICcuLi8uLi91dGlscy9zdHJpbmdzJztcbmltcG9ydCB7IE9EYXRhUGF0aFNlZ21lbnRzIH0gZnJvbSAnLi4vcGF0aCc7XG5pbXBvcnQgeyBPRGF0YVJlcXVlc3QgfSBmcm9tICcuLi9yZXF1ZXN0JztcbmltcG9ydCB7IE9EYXRhUmVzb3VyY2UgfSBmcm9tICcuLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBPRGF0YU9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgT0RhdGFBcGlPcHRpb25zIH0gZnJvbSAnLi4vLi4vb3B0aW9ucyc7XG5pbXBvcnQgeyBPRGF0YVJlc3BvbnNlIH0gZnJvbSAnLi4vcmVzcG9uc2UnO1xuXG5leHBvcnQgY2xhc3MgT0RhdGFCYXRjaFJlcXVlc3Q8VD4gZXh0ZW5kcyBTdWJqZWN0PEh0dHBSZXNwb25zZUJhc2U+IHtcbiAgaWQ6IHN0cmluZztcbiAgZ3JvdXA6IHN0cmluZztcbiAgY29uc3RydWN0b3IocHVibGljIHJlcXVlc3Q6IE9EYXRhUmVxdWVzdDxhbnk+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmlkID0gU3RyaW5ncy51bmlxdWVJZCh7IHByZWZpeDogJ3InIH0pO1xuICAgIHRoaXMuZ3JvdXAgPSBTdHJpbmdzLnVuaXF1ZUlkKHsgcHJlZml4OiAnZycgfSk7XG4gIH1cblxuICBvdmVycmlkZSB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy50b0xlZ2FjeSgpO1xuICB9XG5cbiAgdG9MZWdhY3koeyByZWxhdGl2ZVVybHMgfTogeyByZWxhdGl2ZVVybHM/OiBib29sZWFuIH0gPSB7fSk6IHN0cmluZyB7XG4gICAgLy9UT0RPOiBSZWxhdGl2ZSBvciBBYnNvbHV0ZSB1cmwgP1xuICAgIGxldCByZXMgPSBbXG4gICAgICBgJHt0aGlzLnJlcXVlc3QubWV0aG9kfSAke1xuICAgICAgICByZWxhdGl2ZVVybHMgPyB0aGlzLnJlcXVlc3QucGF0aFdpdGhQYXJhbXMgOiB0aGlzLnJlcXVlc3QudXJsV2l0aFBhcmFtc1xuICAgICAgfSAke0hUVFAxMX1gLFxuICAgIF07XG4gICAgaWYgKFxuICAgICAgdGhpcy5yZXF1ZXN0Lm1ldGhvZCA9PT0gJ1BPU1QnIHx8XG4gICAgICB0aGlzLnJlcXVlc3QubWV0aG9kID09PSAnUEFUQ0gnIHx8XG4gICAgICB0aGlzLnJlcXVlc3QubWV0aG9kID09PSAnUFVUJ1xuICAgICkge1xuICAgICAgcmVzLnB1c2goYCR7Q09OVEVOVF9UWVBFfTogJHtBUFBMSUNBVElPTl9KU09OfWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlcXVlc3QuaGVhZGVycyBpbnN0YW5jZW9mIEh0dHBIZWFkZXJzKSB7XG4gICAgICBsZXQgaGVhZGVycyA9IHRoaXMucmVxdWVzdC5oZWFkZXJzO1xuICAgICAgcmVzID0gW1xuICAgICAgICAuLi5yZXMsXG4gICAgICAgIC4uLmhlYWRlcnNcbiAgICAgICAgICAua2V5cygpXG4gICAgICAgICAgLm1hcCgoa2V5KSA9PiBgJHtrZXl9OiAkeyhoZWFkZXJzLmdldEFsbChrZXkpIHx8IFtdKS5qb2luKCcsJyl9YCksXG4gICAgICBdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlcXVlc3QubWV0aG9kID09PSAnR0VUJyB8fCB0aGlzLnJlcXVlc3QubWV0aG9kID09PSAnREVMRVRFJykge1xuICAgICAgcmVzLnB1c2goTkVXTElORSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcy5wdXNoKGAke05FV0xJTkV9JHtKU09OLnN0cmluZ2lmeSh0aGlzLnJlcXVlc3QuYm9keSl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5qb2luKE5FV0xJTkUpO1xuICB9XG5cbiAgdG9Kc29uKHsgcmVsYXRpdmVVcmxzIH06IHsgcmVsYXRpdmVVcmxzPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBsZXQgcmVzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgbWV0aG9kOiB0aGlzLnJlcXVlc3QubWV0aG9kLFxuICAgICAgdXJsOiByZWxhdGl2ZVVybHNcbiAgICAgICAgPyB0aGlzLnJlcXVlc3QucGF0aFdpdGhQYXJhbXNcbiAgICAgICAgOiB0aGlzLnJlcXVlc3QudXJsV2l0aFBhcmFtcyxcbiAgICAgIC8vJ2F0b21pY2l0eUdyb3VwJzogdGhpcy5ncm91cFxuICAgICAgLy9cImRlcGVuZHNPblwiOiBbXCJnMVwiLCBcImcyXCIsIFwicjJcIl1cbiAgICB9O1xuICAgIGlmICh0aGlzLnJlcXVlc3QuaGVhZGVycyBpbnN0YW5jZW9mIEh0dHBIZWFkZXJzKSB7XG4gICAgICBsZXQgaGVhZGVycyA9IHRoaXMucmVxdWVzdC5oZWFkZXJzO1xuICAgICAgcmVzWydoZWFkZXJzJ10gPSBoZWFkZXJzXG4gICAgICAgIC5rZXlzKClcbiAgICAgICAgLm1hcCgoa2V5KSA9PiBgJHtrZXl9OiAkeyhoZWFkZXJzLmdldEFsbChrZXkpIHx8IFtdKS5qb2luKCcsJyl9YCk7XG4gICAgfVxuICAgIGlmICghKHRoaXMucmVxdWVzdC5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMucmVxdWVzdC5tZXRob2QgPT09ICdERUxFVEUnKSkge1xuICAgICAgcmVzWydib2R5J10gPSB0aGlzLnJlcXVlc3QuYm9keTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgb25Mb2FkKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICB0aGlzLm5leHQocmVzcG9uc2UpO1xuICAgICAgdGhpcy5jb21wbGV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBbiB1bnN1Y2Nlc3NmdWwgcmVxdWVzdCBpcyBkZWxpdmVyZWQgb24gdGhlIGVycm9yIGNoYW5uZWwuXG4gICAgICB0aGlzLmVycm9yKHJlc3BvbnNlIGFzIEh0dHBFcnJvclJlc3BvbnNlKTtcbiAgICB9XG4gIH1cblxuICBvbkVycm9yKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgIHRoaXMuZXJyb3IocmVzcG9uc2UpO1xuICB9XG59XG5cbi8qKlxuICogT0RhdGEgQmF0Y2ggUmVzb3VyY2VcbiAqIGh0dHBzOi8vd3d3Lm9kYXRhLm9yZy9nZXR0aW5nLXN0YXJ0ZWQvYWR2YW5jZWQtdHV0b3JpYWwvI2JhdGNoXG4gKi9cbmV4cG9ydCBjbGFzcyBPRGF0YUJhdGNoUmVzb3VyY2UgZXh0ZW5kcyBPRGF0YVJlc291cmNlPGFueT4ge1xuICAvLyBWQVJJQUJMRVNcbiAgcHJpdmF0ZSBfcmVxdWVzdHM6IE9EYXRhQmF0Y2hSZXF1ZXN0PGFueT5bXSA9IFtdO1xuICByZXF1ZXN0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdHMubWFwKChyKSA9PiByLnJlcXVlc3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzcG9uc2VzOiBIdHRwUmVzcG9uc2VCYXNlW10gfCBudWxsID0gbnVsbDtcbiAgcmVzcG9uc2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNwb25zZXM7XG4gIH1cblxuICAvLyNyZWdpb24gRmFjdG9yeVxuICBzdGF0aWMgZmFjdG9yeShhcGk6IE9EYXRhQXBpKSB7XG4gICAgbGV0IHNlZ21lbnRzID0gbmV3IE9EYXRhUGF0aFNlZ21lbnRzKCk7XG4gICAgc2VnbWVudHMuYWRkKFBhdGhTZWdtZW50LmJhdGNoLCAkQkFUQ0gpO1xuICAgIHJldHVybiBuZXcgT0RhdGFCYXRjaFJlc291cmNlKGFwaSwgeyBzZWdtZW50cyB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNsb25lKCk6IE9EYXRhQmF0Y2hSZXNvdXJjZSB7XG4gICAgY29uc3QgYmF0Y2ggPSBzdXBlci5jbG9uZSgpIGFzIE9EYXRhQmF0Y2hSZXNvdXJjZTtcbiAgICBiYXRjaC5fcmVxdWVzdHMgPSBbLi4udGhpcy5fcmVxdWVzdHNdO1xuICAgIHJldHVybiBiYXRjaDtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBwcml2YXRlIHN0b3JlUmVxdWVzdGVyKCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmFwaS5yZXF1ZXN0ZXI7XG4gICAgLy8gU3dpdGNoIHRvIHRoZSBiYXRjaCByZXF1ZXN0ZXJcbiAgICB0aGlzLmFwaS5yZXF1ZXN0ZXIgPSAocmVxOiBPRGF0YVJlcXVlc3Q8YW55Pik6IE9ic2VydmFibGU8YW55PiA9PiB7XG4gICAgICBpZiAocmVxLmFwaSAhPT0gdGhpcy5hcGkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQmF0Y2ggUmVxdWVzdCBhcmUgZm9yIHRoZSBzYW1lIGFwaS4nKTtcbiAgICAgIGlmIChyZXEub2JzZXJ2ZSA9PT0gJ2V2ZW50cycpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhdGNoIFJlcXVlc3QgZG9lcyBub3QgYWxsb3dzIG9ic2VydmUgPT0gJ2V2ZW50cycuXCIpO1xuICAgICAgdGhpcy5fcmVxdWVzdHMucHVzaChuZXcgT0RhdGFCYXRjaFJlcXVlc3Q8YW55PihyZXEpKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0c1t0aGlzLl9yZXF1ZXN0cy5sZW5ndGggLSAxXTtcbiAgICB9O1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlUmVxdWVzdGVyKFxuICAgIGhhbmRsZXI6ICgocmVxOiBPRGF0YVJlcXVlc3Q8YW55PikgPT4gT2JzZXJ2YWJsZTxhbnk+KSB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgdGhpcy5hcGkucmVxdWVzdGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdG8gYmF0Y2ggcmVxdWVzdFxuICAgKiBAcGFyYW0gY3R4IFRoZSBjb250ZXh0IGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGV4ZWN1dGUgdGhlIGNvbnRleHRcbiAgICovXG4gIGFkZDxSPihjdHg6IChiYXRjaDogdGhpcykgPT4gUik6IFIge1xuICAgIC8vIFN0b3JlIG9yaWdpbmFsIHJlcXVlc3RlclxuICAgIHZhciBoYW5kbGVyID0gdGhpcy5zdG9yZVJlcXVlc3RlcigpO1xuICAgIC8vIEV4ZWN1dGUgdGhlIGNvbnRleHRcbiAgICBjb25zdCByZXN1bHQgPSBjdHgodGhpcyk7XG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCByZXF1ZXN0ZXJcbiAgICB0aGlzLnJlc3RvcmVSZXF1ZXN0ZXIoaGFuZGxlcik7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc2VuZChvcHRpb25zPzogT0RhdGFPcHRpb25zKTogT2JzZXJ2YWJsZTxPRGF0YVJlc3BvbnNlPGFueT4+IHtcbiAgICBpZiAodGhpcy5hcGkub3B0aW9ucy5qc29uQmF0Y2hGb3JtYXQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbmRKc29uKG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5zZW5kTGVnYWN5KG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VuZEpzb24ob3B0aW9ucz86IE9EYXRhT3B0aW9ucyk6IE9ic2VydmFibGU8T0RhdGFSZXNwb25zZTxPYmplY3Q+PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IEh0dHAubWVyZ2VIdHRwSGVhZGVycygob3B0aW9ucyAmJiBvcHRpb25zLmhlYWRlcnMpIHx8IHt9LCB7XG4gICAgICBbT0RBVEFfVkVSU0lPTl06IFZFUlNJT05fNF8wLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmFwaVxuICAgICAgLnJlcXVlc3Q8b2JqZWN0PignUE9TVCcsIHRoaXMsIHtcbiAgICAgICAgYm9keTogT0RhdGFCYXRjaFJlc291cmNlLmJ1aWxkSnNvbkJvZHkoXG4gICAgICAgICAgdGhpcy5fcmVxdWVzdHMsXG4gICAgICAgICAgdGhpcy5hcGkub3B0aW9ucyxcbiAgICAgICAgKSxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsXG4gICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgIHBhcmFtczogb3B0aW9ucyA/IG9wdGlvbnMucGFyYW1zIDogdW5kZWZpbmVkLFxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IG9wdGlvbnMgPyBvcHRpb25zLndpdGhDcmVkZW50aWFscyA6IHVuZGVmaW5lZCxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZTogT0RhdGFSZXNwb25zZTxPYmplY3Q+KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX3Jlc3BvbnNlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNwb25zZXMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcmVzcG9uc2VzID0gW1xuICAgICAgICAgICAgLi4udGhpcy5fcmVzcG9uc2VzLFxuICAgICAgICAgICAgLi4uT0RhdGFCYXRjaFJlc291cmNlLnBhcnNlSnNvblJlc3BvbnNlKHRoaXMuX3JlcXVlc3RzLCByZXNwb25zZSksXG4gICAgICAgICAgXTtcbiAgICAgICAgICAvL0hBQ0s6IHR1cGxlWzFdID09PSB1bmRlZmluZWRcbiAgICAgICAgICBBcnJheXMuemlwKHRoaXMuX3JlcXVlc3RzLCB0aGlzLl9yZXNwb25zZXMpLmZvckVhY2goKHR1cGxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXR1cGxlWzBdLmlzU3RvcHBlZCAmJiB0dXBsZVsxXSkgdHVwbGVbMF0ub25Mb2FkKHR1cGxlWzFdKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VuZExlZ2FjeShcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPE9EYXRhUmVzcG9uc2U8c3RyaW5nPj4ge1xuICAgIGNvbnN0IGJvdW5kID0gU3RyaW5ncy51bmlxdWVJZCh7IHByZWZpeDogQkFUQ0hfUFJFRklYIH0pO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBIdHRwLm1lcmdlSHR0cEhlYWRlcnMoKG9wdGlvbnMgJiYgb3B0aW9ucy5oZWFkZXJzKSB8fCB7fSwge1xuICAgICAgW09EQVRBX1ZFUlNJT05dOiBWRVJTSU9OXzRfMCxcbiAgICAgIFtDT05URU5UX1RZUEVdOiBNVUxUSVBBUlRfTUlYRURfQk9VTkRBUlkgKyBib3VuZCxcbiAgICAgIFtBQ0NFUFRdOiBNVUxUSVBBUlRfTUlYRUQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAucmVxdWVzdDxPRGF0YVJlc3BvbnNlPHN0cmluZz4+KCdQT1NUJywgdGhpcywge1xuICAgICAgICBib2R5OiBPRGF0YUJhdGNoUmVzb3VyY2UuYnVpbGRMZWdhY3lCb2R5KFxuICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgIHRoaXMuX3JlcXVlc3RzLFxuICAgICAgICAgIHRoaXMuYXBpLm9wdGlvbnMsXG4gICAgICAgICksXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICBwYXJhbXM6IG9wdGlvbnMgPyBvcHRpb25zLnBhcmFtcyA6IHVuZGVmaW5lZCxcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBvcHRpb25zID8gb3B0aW9ucy53aXRoQ3JlZGVudGlhbHMgOiB1bmRlZmluZWQsXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2U6IE9EYXRhUmVzcG9uc2U8c3RyaW5nPikgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9yZXNwb25zZXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VzID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3Jlc3BvbnNlcyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuX3Jlc3BvbnNlcyxcbiAgICAgICAgICAgIC4uLk9EYXRhQmF0Y2hSZXNvdXJjZS5wYXJzZUxlZ2FjeVJlc3BvbnNlKHRoaXMuX3JlcXVlc3RzLCByZXNwb25zZSksXG4gICAgICAgICAgXTtcbiAgICAgICAgICBBcnJheXMuemlwKHRoaXMuX3JlcXVlc3RzLCB0aGlzLl9yZXNwb25zZXMpLmZvckVhY2goKHR1cGxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXR1cGxlWzBdLmlzU3RvcHBlZCAmJiB0dXBsZVsxXSkgdHVwbGVbMF0ub25Mb2FkKHR1cGxlWzFdKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBiYXRjaCByZXF1ZXN0XG4gICAqIEBwYXJhbSBjdHggVGhlIGNvbnRleHQgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIG9mIHRoZSBiYXRjaCByZXF1ZXN0XG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgZXhlY3V0ZSB0aGUgY29udGV4dFxuICAgKi9cbiAgZXhlYzxSPihcbiAgICBjdHg6IChiYXRjaDogdGhpcykgPT4gUixcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPFtSLCBPRGF0YVJlc3BvbnNlPHN0cmluZz5dPiB7XG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuYWRkKGN0eCk7XG4gICAgcmV0dXJuIHRoaXMuc2VuZChvcHRpb25zKS5waXBlKG1hcCgocmVzcG9uc2UpID0+IFtyZXN1bHQsIHJlc3BvbnNlXSkpO1xuICB9XG5cbiAgYm9keSgpIHtcbiAgICByZXR1cm4gT0RhdGFCYXRjaFJlc291cmNlLmJ1aWxkTGVnYWN5Qm9keShcbiAgICAgIFN0cmluZ3MudW5pcXVlSWQoeyBwcmVmaXg6IEJBVENIX1BSRUZJWCB9KSxcbiAgICAgIHRoaXMuX3JlcXVlc3RzLFxuICAgICAgdGhpcy5hcGkub3B0aW9ucyxcbiAgICApO1xuICB9XG5cbiAganNvbigpIHtcbiAgICByZXR1cm4gT0RhdGFCYXRjaFJlc291cmNlLmJ1aWxkSnNvbkJvZHkodGhpcy5fcmVxdWVzdHMsIHRoaXMuYXBpLm9wdGlvbnMpO1xuICB9XG5cbiAgc3RhdGljIGJ1aWxkTGVnYWN5Qm9keShcbiAgICBiYXRjaEJvdW5kYXJ5OiBzdHJpbmcsXG4gICAgcmVxdWVzdHM6IE9EYXRhQmF0Y2hSZXF1ZXN0PGFueT5bXSxcbiAgICBvcHRpb25zOiBPRGF0YUFwaU9wdGlvbnMsXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHJlcyA9IFtdO1xuICAgIGxldCBjaGFuZ2VzZXRCb3VuZGFyeTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNoYW5nZXNldElkID0gMTtcblxuICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiByZXF1ZXN0cykge1xuICAgICAgLy8gaWYgbWV0aG9kIGlzIEdFVCBhbmQgdGhlcmUgaXMgYSBjaGFuZ2VzZXQgYm91bmRhcnkgb3BlbiB0aGVuIGNsb3NlIGl0XG4gICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0Lm1ldGhvZCA9PT0gJ0dFVCcgJiYgY2hhbmdlc2V0Qm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgICAgcmVzLnB1c2goXG4gICAgICAgICAgYCR7Qk9VTkRBUllfUFJFRklYX1NVRkZJWH0ke2NoYW5nZXNldEJvdW5kYXJ5fSR7Qk9VTkRBUllfUFJFRklYX1NVRkZJWH1gLFxuICAgICAgICApO1xuICAgICAgICBjaGFuZ2VzZXRCb3VuZGFyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGNoYW5nZXNldCBib3VuZGFyeSBvcGVuIHRoZW4gb3BlbiBhIGJhdGNoIGJvdW5kYXJ5XG4gICAgICBpZiAoY2hhbmdlc2V0Qm91bmRhcnkgPT09IG51bGwpIHtcbiAgICAgICAgcmVzLnB1c2goYCR7Qk9VTkRBUllfUFJFRklYX1NVRkZJWH0ke2JhdGNoQm91bmRhcnl9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIG1ldGhvZCBpcyBub3QgR0VUIGFuZCB0aGVyZSBpcyBubyBjaGFuZ2VzZXQgYm91bmRhcnkgb3BlbiB0aGVuIG9wZW4gYSBjaGFuZ2VzZXQgYm91bmRhcnlcbiAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3QubWV0aG9kICE9PSAnR0VUJykge1xuICAgICAgICBpZiAoY2hhbmdlc2V0Qm91bmRhcnkgPT09IG51bGwpIHtcbiAgICAgICAgICBjaGFuZ2VzZXRCb3VuZGFyeSA9IFN0cmluZ3MudW5pcXVlSWQoeyBwcmVmaXg6IENIQU5HRVNFVF9QUkVGSVggfSk7XG4gICAgICAgICAgcmVzLnB1c2goXG4gICAgICAgICAgICBgJHtDT05URU5UX1RZUEV9OiAke01VTFRJUEFSVF9NSVhFRF9CT1VOREFSWX0ke2NoYW5nZXNldEJvdW5kYXJ5fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXMucHVzaChORVdMSU5FKTtcbiAgICAgICAgfVxuICAgICAgICByZXMucHVzaChgJHtCT1VOREFSWV9QUkVGSVhfU1VGRklYfSR7Y2hhbmdlc2V0Qm91bmRhcnl9YCk7XG4gICAgICB9XG5cbiAgICAgIHJlcy5wdXNoKGAke0NPTlRFTlRfVFlQRX06ICR7QVBQTElDQVRJT05fSFRUUH1gKTtcbiAgICAgIHJlcy5wdXNoKGAke0NPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkd9OiAke0JJTkFSWX1gKTtcblxuICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdC5tZXRob2QgIT09ICdHRVQnKSB7XG4gICAgICAgIHJlcy5wdXNoKGAke0NPTlRFTlRfSUR9OiAke2NoYW5nZXNldElkKyt9YCk7XG4gICAgICB9XG5cbiAgICAgIHJlcy5wdXNoKE5FV0xJTkUpO1xuICAgICAgcmVzLnB1c2goYCR7cmVxdWVzdC50b0xlZ2FjeShvcHRpb25zKX1gKTtcbiAgICB9XG5cbiAgICBpZiAocmVzLmxlbmd0aCkge1xuICAgICAgaWYgKGNoYW5nZXNldEJvdW5kYXJ5ICE9PSBudWxsKSB7XG4gICAgICAgIHJlcy5wdXNoKFxuICAgICAgICAgIGAke0JPVU5EQVJZX1BSRUZJWF9TVUZGSVh9JHtjaGFuZ2VzZXRCb3VuZGFyeX0ke0JPVU5EQVJZX1BSRUZJWF9TVUZGSVh9YCxcbiAgICAgICAgKTtcbiAgICAgICAgY2hhbmdlc2V0Qm91bmRhcnkgPSBudWxsO1xuICAgICAgfVxuICAgICAgcmVzLnB1c2goXG4gICAgICAgIGAke0JPVU5EQVJZX1BSRUZJWF9TVUZGSVh9JHtiYXRjaEJvdW5kYXJ5fSR7Qk9VTkRBUllfUFJFRklYX1NVRkZJWH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5qb2luKE5FV0xJTkUpO1xuICB9XG5cbiAgc3RhdGljIGJ1aWxkSnNvbkJvZHkoXG4gICAgcmVxdWVzdHM6IE9EYXRhQmF0Y2hSZXF1ZXN0PGFueT5bXSxcbiAgICBvcHRpb25zOiBPRGF0YUFwaU9wdGlvbnMsXG4gICk6IE9iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVlc3RzOiByZXF1ZXN0cy5tYXAoKHJlcXVlc3QpID0+IHJlcXVlc3QudG9Kc29uKG9wdGlvbnMpKSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIHBhcnNlTGVnYWN5UmVzcG9uc2UoXG4gICAgcmVxdWVzdHM6IE9EYXRhQmF0Y2hSZXF1ZXN0PGFueT5bXSxcbiAgICByZXNwb25zZTogT0RhdGFSZXNwb25zZTxzdHJpbmc+LFxuICApOiBIdHRwUmVzcG9uc2VCYXNlW10ge1xuICAgIGxldCBjaHVua3M6IHN0cmluZ1tdW10gPSBbXTtcbiAgICBjb25zdCBjb250ZW50VHlwZTogc3RyaW5nID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoQ09OVEVOVF9UWVBFKSB8fCAnJztcbiAgICBjb25zdCBiYXRjaEJvdW5kYXJ5OiBzdHJpbmcgPSBIdHRwLmJvdW5kYXJ5RGVsaW1pdGVyKGNvbnRlbnRUeXBlKTtcbiAgICBjb25zdCBlbmRMaW5lOiBzdHJpbmcgPSBIdHRwLmJvdW5kYXJ5RW5kKGJhdGNoQm91bmRhcnkpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gKHJlc3BvbnNlLmJvZHkgfHwgJycpLnNwbGl0KE5FV0xJTkVfUkVHRVhQKTtcblxuICAgIGxldCBjaGFuZ2VzZXRSZXNwb25zZXM6IHN0cmluZ1tdW10gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY29udGVudElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY2hhbmdlc2V0Qm91bmRhcnk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjaGFuZ2VzZXRFbmRMaW5lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgc3RhcnRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2luZGV4XTtcblxuICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChDT05URU5UX1RZUEUpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlVmFsdWU6IHN0cmluZyA9IEh0dHAuaGVhZGVyVmFsdWUobGluZSk7XG4gICAgICAgIGlmIChjb250ZW50VHlwZVZhbHVlID09PSBNVUxUSVBBUlRfTUlYRUQpIHtcbiAgICAgICAgICBjaGFuZ2VzZXRSZXNwb25zZXMgPSBbXTtcbiAgICAgICAgICBjb250ZW50SWQgPSBudWxsO1xuICAgICAgICAgIGNoYW5nZXNldEJvdW5kYXJ5ID0gSHR0cC5ib3VuZGFyeURlbGltaXRlcihsaW5lKTtcbiAgICAgICAgICBjaGFuZ2VzZXRFbmRMaW5lID0gSHR0cC5ib3VuZGFyeUVuZChjaGFuZ2VzZXRCb3VuZGFyeSk7XG4gICAgICAgICAgc3RhcnRJbmRleCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZXNldFJlc3BvbnNlcyAhPT0gbnVsbCAmJiBsaW5lLnN0YXJ0c1dpdGgoQ09OVEVOVF9JRCkpIHtcbiAgICAgICAgY29udGVudElkID0gTnVtYmVyKEh0dHAuaGVhZGVyVmFsdWUobGluZSkpO1xuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoSFRUUDExKSkge1xuICAgICAgICBzdGFydEluZGV4ID0gaW5kZXg7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBsaW5lID09PSBiYXRjaEJvdW5kYXJ5IHx8XG4gICAgICAgIGxpbmUgPT09IGNoYW5nZXNldEJvdW5kYXJ5IHx8XG4gICAgICAgIGxpbmUgPT09IGVuZExpbmUgfHxcbiAgICAgICAgbGluZSA9PT0gY2hhbmdlc2V0RW5kTGluZVxuICAgICAgKSB7XG4gICAgICAgIGlmICghc3RhcnRJbmRleCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNodW5rID0gbGluZXMuc2xpY2Uoc3RhcnRJbmRleCwgaW5kZXgpO1xuICAgICAgICBpZiAoY2hhbmdlc2V0UmVzcG9uc2VzICE9PSBudWxsICYmIGNvbnRlbnRJZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGNoYW5nZXNldFJlc3BvbnNlc1tjb250ZW50SWRdID0gY2h1bms7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpbmUgPT09IGJhdGNoQm91bmRhcnkgfHwgbGluZSA9PT0gY2hhbmdlc2V0Qm91bmRhcnkpIHtcbiAgICAgICAgICBzdGFydEluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgICB9IGVsc2UgaWYgKGxpbmUgPT09IGVuZExpbmUgfHwgbGluZSA9PT0gY2hhbmdlc2V0RW5kTGluZSkge1xuICAgICAgICAgIGlmIChjaGFuZ2VzZXRSZXNwb25zZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgY2hhbmdlc2V0UmVzcG9uc2VzKSB7XG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjaGFuZ2VzZXRSZXNwb25zZXMgPSBudWxsO1xuICAgICAgICAgIGNoYW5nZXNldEJvdW5kYXJ5ID0gbnVsbDtcbiAgICAgICAgICBjaGFuZ2VzZXRFbmRMaW5lID0gbnVsbDtcbiAgICAgICAgICBzdGFydEluZGV4ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2h1bmtzLm1hcCgoY2h1bms6IHN0cmluZ1tdLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBsZXQgcmVxdWVzdCA9IHJlcXVlc3RzW2luZGV4XS5yZXF1ZXN0O1xuICAgICAgbGV0IHsgY29kZSwgbWVzc2FnZSB9ID0gSHR0cC5wYXJzZVJlc3BvbnNlU3RhdHVzKGNodW5rWzBdKTtcbiAgICAgIGNodW5rID0gY2h1bmsuc2xpY2UoMSk7XG5cbiAgICAgIGxldCBoZWFkZXJzOiBIdHRwSGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgICAgdmFyIGluZGV4ID0gMTtcbiAgICAgIGZvciAoOyBpbmRleCA8IGNodW5rLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBiYXRjaEJvZHlMaW5lOiBzdHJpbmcgPSBjaHVua1tpbmRleF07XG5cbiAgICAgICAgaWYgKGJhdGNoQm9keUxpbmUgPT09ICcnKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXRjaEJvZHlMaW5lUGFydHM6IHN0cmluZ1tdID0gYmF0Y2hCb2R5TGluZS5zcGxpdCgnOiAnKTtcbiAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuYXBwZW5kKFxuICAgICAgICAgIGJhdGNoQm9keUxpbmVQYXJ0c1swXS50cmltKCksXG4gICAgICAgICAgYmF0Y2hCb2R5TGluZVBhcnRzWzFdLnRyaW0oKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGJvZHk6IHN0cmluZyB8IHsgZXJyb3I6IGFueTsgdGV4dDogc3RyaW5nIH0gPSAnJztcbiAgICAgIGZvciAoOyBpbmRleCA8IGNodW5rLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBib2R5ICs9IGNodW5rW2luZGV4XTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgY29kZSA9ICEhYm9keSA/IDIwMCA6IDA7XG4gICAgICB9XG5cbiAgICAgIGxldCBvayA9IGNvZGUgPj0gMjAwICYmIGNvZGUgPCAzMDA7XG4gICAgICBpZiAocmVxdWVzdC5yZXNwb25zZVR5cGUgPT09ICdqc29uJyAmJiB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxCb2R5ID0gYm9keTtcbiAgICAgICAgYm9keSA9IGJvZHkucmVwbGFjZShYU1NJX1BSRUZJWCwgJycpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJvZHkgPSBib2R5ICE9PSAnJyA/IEpTT04ucGFyc2UoYm9keSkgOiBudWxsO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGJvZHkgPSBvcmlnaW5hbEJvZHk7XG5cbiAgICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgIG9rID0gZmFsc2U7XG4gICAgICAgICAgICBib2R5ID0geyBlcnJvciwgdGV4dDogYm9keSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2tcbiAgICAgICAgPyBuZXcgSHR0cFJlc3BvbnNlPGFueT4oe1xuICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICBzdGF0dXNUZXh0OiBtZXNzYWdlLFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybFdpdGhQYXJhbXMsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBuZXcgSHR0cEVycm9yUmVzcG9uc2Uoe1xuICAgICAgICAgICAgLy8gVGhlIGVycm9yIGluIHRoaXMgY2FzZSBpcyB0aGUgcmVzcG9uc2UgYm9keSAoZXJyb3IgZnJvbSB0aGUgc2VydmVyKS5cbiAgICAgICAgICAgIGVycm9yOiBib2R5LFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IG1lc3NhZ2UsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsV2l0aFBhcmFtcyxcbiAgICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUpzb25SZXNwb25zZShcbiAgICByZXF1ZXN0czogT0RhdGFCYXRjaFJlcXVlc3Q8YW55PltdLFxuICAgIHJlc3BvbnNlOiBPRGF0YVJlc3BvbnNlPGFueT4sXG4gICk6IEh0dHBSZXNwb25zZUJhc2VbXSB7XG4gICAgY29uc3QgcmVzcG9uc2VzOiBPYmplY3RbXSA9XG4gICAgICAocmVzcG9uc2UuYm9keSA/IHJlc3BvbnNlLmJvZHkgOiB7fSlbJ3Jlc3BvbnNlcyddID8/IFtdO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlcy5tYXAoKHJlc3BvbnNlOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGxldCByZXF1ZXN0ID0gcmVxdWVzdHNbaW5kZXhdLnJlcXVlc3Q7XG4gICAgICBsZXQgY29kZSA9IHJlc3BvbnNlWydzdGF0dXMnXTtcblxuICAgICAgbGV0IGhlYWRlcnM6IEh0dHBIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHJlc3BvbnNlWydoZWFkZXJzJ10pO1xuICAgICAgbGV0IGJvZHk6IHN0cmluZyB8IHsgZXJyb3I6IGFueTsgdGV4dDogc3RyaW5nIH0gPSByZXNwb25zZVsnYm9keSddO1xuICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgY29kZSA9ICEhYm9keSA/IDIwMCA6IDA7XG4gICAgICB9XG5cbiAgICAgIGxldCBvayA9IGNvZGUgPj0gMjAwICYmIGNvZGUgPCAzMDA7XG4gICAgICBpZiAocmVxdWVzdC5yZXNwb25zZVR5cGUgPT09ICdqc29uJyAmJiB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxCb2R5ID0gYm9keTtcbiAgICAgICAgYm9keSA9IGJvZHkucmVwbGFjZShYU1NJX1BSRUZJWCwgJycpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJvZHkgPSBib2R5ICE9PSAnJyA/IEpTT04ucGFyc2UoYm9keSkgOiBudWxsO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGJvZHkgPSBvcmlnaW5hbEJvZHk7XG5cbiAgICAgICAgICBpZiAob2spIHtcbiAgICAgICAgICAgIG9rID0gZmFsc2U7XG4gICAgICAgICAgICBib2R5ID0geyBlcnJvciwgdGV4dDogYm9keSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2tcbiAgICAgICAgPyBuZXcgSHR0cFJlc3BvbnNlPGFueT4oe1xuICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBzdGF0dXM6IGNvZGUsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsV2l0aFBhcmFtcyxcbiAgICAgICAgICB9KVxuICAgICAgICA6IG5ldyBIdHRwRXJyb3JSZXNwb25zZSh7XG4gICAgICAgICAgICAvLyBUaGUgZXJyb3IgaW4gdGhpcyBjYXNlIGlzIHRoZSByZXNwb25zZSBib2R5IChlcnJvciBmcm9tIHRoZSBzZXJ2ZXIpLlxuICAgICAgICAgICAgZXJyb3I6IGJvZHksXG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybFdpdGhQYXJhbXMsXG4gICAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|