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
|
@@ -1,814 +0,0 @@
|
|
|
1
|
-
import { forkJoin, Observable, of, throwError } from 'rxjs';
|
|
2
|
-
import { defaultIfEmpty, finalize, map, switchMap } from 'rxjs/operators';
|
|
3
|
-
import { DEFAULT_VERSION } from '../constants';
|
|
4
|
-
import { ODataHelper } from '../helper';
|
|
5
|
-
import { ODataEntitySetResource, ODataNavigationPropertyResource, ODataPropertyResource, } from '../resources';
|
|
6
|
-
import { Types } from '../utils/types';
|
|
7
|
-
import { INCLUDE_DEEP, ODataModelEventEmitter, ODataModelEventType, ODataModelOptions, ODataModelState, } from './options';
|
|
8
|
-
import { ODataEntitiesAnnotations, ODataEntityAnnotations, } from '../annotations';
|
|
9
|
-
export class ODataCollection {
|
|
10
|
-
static { this.model = null; }
|
|
11
|
-
models() {
|
|
12
|
-
return this._entries
|
|
13
|
-
.filter((e) => e.state !== ODataModelState.Removed)
|
|
14
|
-
.map((e) => e.model);
|
|
15
|
-
}
|
|
16
|
-
get length() {
|
|
17
|
-
return this.models().length;
|
|
18
|
-
}
|
|
19
|
-
constructor(entities = [], { parent, resource, annots, model, reset = false, } = {}) {
|
|
20
|
-
this._parent = null;
|
|
21
|
-
this._resource = null;
|
|
22
|
-
this._resources = [];
|
|
23
|
-
this._entries = [];
|
|
24
|
-
this._sortBy = null;
|
|
25
|
-
const Klass = this.constructor;
|
|
26
|
-
if (!model && Klass.model !== null)
|
|
27
|
-
model = Klass.model;
|
|
28
|
-
if (!model)
|
|
29
|
-
throw new Error('Collection: Collection need model');
|
|
30
|
-
this._model = model;
|
|
31
|
-
// Events
|
|
32
|
-
this.events$ = new ODataModelEventEmitter({ collection: this });
|
|
33
|
-
this.events$.subscribe((e) => model.meta.events$.emit(e));
|
|
34
|
-
// Parent
|
|
35
|
-
if (parent !== undefined) {
|
|
36
|
-
this._parent = parent;
|
|
37
|
-
}
|
|
38
|
-
// Resource
|
|
39
|
-
if (this._parent === null && !resource)
|
|
40
|
-
resource = this._model.meta.collectionResourceFactory();
|
|
41
|
-
if (resource) {
|
|
42
|
-
this.attach(resource);
|
|
43
|
-
}
|
|
44
|
-
// Annotations
|
|
45
|
-
this._annotations =
|
|
46
|
-
annots ||
|
|
47
|
-
new ODataEntitiesAnnotations(ODataHelper[resource?.api?.options.version || DEFAULT_VERSION]);
|
|
48
|
-
entities = entities || [];
|
|
49
|
-
this.assign(entities, { reset });
|
|
50
|
-
}
|
|
51
|
-
isParentOf(child) {
|
|
52
|
-
return (child !== this &&
|
|
53
|
-
ODataModelOptions.chain(child).some((p) => p[0] === this));
|
|
54
|
-
}
|
|
55
|
-
resource() {
|
|
56
|
-
return ODataModelOptions.resource(this);
|
|
57
|
-
}
|
|
58
|
-
pushResource(resource) {
|
|
59
|
-
// Push current parent and resource
|
|
60
|
-
this._resources.push({ parent: this._parent, resource: this._resource });
|
|
61
|
-
// Replace parent and resource
|
|
62
|
-
this._parent = null;
|
|
63
|
-
this._resource = resource;
|
|
64
|
-
}
|
|
65
|
-
popResource() {
|
|
66
|
-
// Pop parent and resource
|
|
67
|
-
const pop = this._resources.pop();
|
|
68
|
-
if (pop !== undefined) {
|
|
69
|
-
const current = { parent: this._parent, resource: this._resource };
|
|
70
|
-
this._parent = pop.parent;
|
|
71
|
-
this._resource = pop.resource;
|
|
72
|
-
return current;
|
|
73
|
-
}
|
|
74
|
-
return undefined;
|
|
75
|
-
}
|
|
76
|
-
attach(resource) {
|
|
77
|
-
if (this._resource !== null &&
|
|
78
|
-
this._resource.outgoingType() !== resource.outgoingType() &&
|
|
79
|
-
!this._resource.isSubtypeOf(resource))
|
|
80
|
-
throw new Error(`attach: Can't reattach ${this._resource.outgoingType()} to ${resource.outgoingType()}`);
|
|
81
|
-
this._entries.forEach(({ model }) => {
|
|
82
|
-
const modelResource = this._model.meta.modelResourceFactory(resource.cloneQuery());
|
|
83
|
-
if (modelResource !== undefined)
|
|
84
|
-
model.attach(modelResource);
|
|
85
|
-
});
|
|
86
|
-
const current = this._resource;
|
|
87
|
-
if (current === null || !current.isEqualTo(resource)) {
|
|
88
|
-
this._resource = resource;
|
|
89
|
-
this.events$.trigger(ODataModelEventType.Attach, {
|
|
90
|
-
previous: current,
|
|
91
|
-
value: resource,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
withResource(resource, ctx) {
|
|
96
|
-
// Push
|
|
97
|
-
this.pushResource(resource);
|
|
98
|
-
// Execute
|
|
99
|
-
const result = ctx(this);
|
|
100
|
-
if (result instanceof Observable) {
|
|
101
|
-
return result.pipe(finalize(() => this.popResource()));
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
// Pop
|
|
105
|
-
this.popResource();
|
|
106
|
-
return result;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
asEntitySet(ctx) {
|
|
110
|
-
// Build new resource
|
|
111
|
-
const resource = this._model.meta.collectionResourceFactory(this._resource?.cloneQuery());
|
|
112
|
-
return this.withResource(resource, ctx);
|
|
113
|
-
}
|
|
114
|
-
annots() {
|
|
115
|
-
return this._annotations;
|
|
116
|
-
}
|
|
117
|
-
modelFactory(data, { reset = false } = {}) {
|
|
118
|
-
let Model = this._model;
|
|
119
|
-
const annots = new ODataEntityAnnotations(this._annotations.helper);
|
|
120
|
-
annots.update(data);
|
|
121
|
-
if (annots?.type !== undefined && Model.meta !== null) {
|
|
122
|
-
const schema = Model.meta.findChildOptions((o) => o.isTypeOf(annots.type))?.structuredType;
|
|
123
|
-
if (schema !== undefined && schema.model !== undefined)
|
|
124
|
-
// Change to child model
|
|
125
|
-
Model = schema.model;
|
|
126
|
-
}
|
|
127
|
-
return new Model(data, {
|
|
128
|
-
annots,
|
|
129
|
-
reset,
|
|
130
|
-
parent: [this, null],
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
toEntities({ client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_id = false, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
|
|
134
|
-
return this._entries
|
|
135
|
-
.filter(({ model, state }) => state !== ODataModelState.Removed && chain.every((c) => c !== model))
|
|
136
|
-
.map(({ model, state }) => {
|
|
137
|
-
var changesOnly = changes_only && state !== ODataModelState.Added;
|
|
138
|
-
return model.toEntity({
|
|
139
|
-
client_id,
|
|
140
|
-
include_navigation,
|
|
141
|
-
include_concurrency,
|
|
142
|
-
include_computed,
|
|
143
|
-
include_key,
|
|
144
|
-
include_id,
|
|
145
|
-
include_non_field,
|
|
146
|
-
field_mapping,
|
|
147
|
-
changes_only: changesOnly,
|
|
148
|
-
chain: [this, ...chain],
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
toJson() {
|
|
153
|
-
return this.toEntities(INCLUDE_DEEP);
|
|
154
|
-
}
|
|
155
|
-
hasChanged({ include_navigation } = {}) {
|
|
156
|
-
return (this._entries.some((e) => e.state !== ODataModelState.Unchanged) ||
|
|
157
|
-
this.models().some((m) => m.hasChanged({ include_navigation })));
|
|
158
|
-
}
|
|
159
|
-
clone() {
|
|
160
|
-
return new this.constructor(this.toEntities(INCLUDE_DEEP), {
|
|
161
|
-
resource: this.resource(),
|
|
162
|
-
annots: this.annots(),
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
_request(obs$, mapCallback) {
|
|
166
|
-
this.events$.trigger(ODataModelEventType.Request, {
|
|
167
|
-
options: { observable: obs$ },
|
|
168
|
-
});
|
|
169
|
-
return obs$.pipe(map((response) => mapCallback(response)), finalize(() => this.events$.trigger(ODataModelEventType.Sync)));
|
|
170
|
-
}
|
|
171
|
-
fetch({ add, merge, remove, withCount, ...options } = {}) {
|
|
172
|
-
const resource = this.resource();
|
|
173
|
-
if (!resource)
|
|
174
|
-
return throwError(() => new Error('fetch: Resource is null'));
|
|
175
|
-
const obs$ = resource instanceof ODataEntitySetResource
|
|
176
|
-
? resource.fetch({ withCount, ...options })
|
|
177
|
-
: resource.fetch({
|
|
178
|
-
responseType: 'entities',
|
|
179
|
-
withCount,
|
|
180
|
-
...options,
|
|
181
|
-
});
|
|
182
|
-
return this._request(obs$, ({ entities, annots }) => {
|
|
183
|
-
this._annotations = annots;
|
|
184
|
-
return entities !== null
|
|
185
|
-
? this.assign(entities, {
|
|
186
|
-
reset: true,
|
|
187
|
-
add: add ?? true,
|
|
188
|
-
merge: merge ?? true,
|
|
189
|
-
remove: remove ?? true,
|
|
190
|
-
})
|
|
191
|
-
: [];
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
fetchAll({ add, merge, remove, withCount, ...options } = {}) {
|
|
195
|
-
const resource = this.resource();
|
|
196
|
-
if (!resource)
|
|
197
|
-
return throwError(() => new Error('fetchAll: Resource is null'));
|
|
198
|
-
const obs$ = resource.fetchAll({ withCount, ...options });
|
|
199
|
-
return this._request(obs$, ({ entities, annots }) => {
|
|
200
|
-
this._annotations = annots;
|
|
201
|
-
return entities !== null
|
|
202
|
-
? this.assign(entities, {
|
|
203
|
-
reset: true,
|
|
204
|
-
add: add ?? true,
|
|
205
|
-
merge: merge ?? true,
|
|
206
|
-
remove: remove ?? true,
|
|
207
|
-
})
|
|
208
|
-
: [];
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
fetchMany(top, { add, merge, remove, withCount, ...options } = {}) {
|
|
212
|
-
const resource = this.resource();
|
|
213
|
-
if (!resource)
|
|
214
|
-
return throwError(() => new Error('fetchMany: Resource is null'));
|
|
215
|
-
resource.query((q) => remove || this.length == 0 ? q.skip().clear() : q.skip(this.length));
|
|
216
|
-
const obs$ = resource.fetchMany(top, { withCount, ...options });
|
|
217
|
-
return this._request(obs$, ({ entities, annots }) => {
|
|
218
|
-
this._annotations = annots;
|
|
219
|
-
return entities !== null
|
|
220
|
-
? this.assign(entities, {
|
|
221
|
-
reset: true,
|
|
222
|
-
add: add ?? true,
|
|
223
|
-
merge: merge ?? true,
|
|
224
|
-
remove: remove ?? false,
|
|
225
|
-
})
|
|
226
|
-
: [];
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
fetchOne({ add, merge, remove, withCount, ...options } = {}) {
|
|
230
|
-
const resource = this.resource();
|
|
231
|
-
if (!resource)
|
|
232
|
-
return throwError(() => new Error('fetchOne: Resource is null'));
|
|
233
|
-
resource.query((q) => remove || this.length == 0 ? q.skip().clear() : q.skip(this.length));
|
|
234
|
-
const obs$ = resource.fetchOne({ withCount, ...options });
|
|
235
|
-
return this._request(obs$, ({ entity, annots }) => {
|
|
236
|
-
this._annotations = annots;
|
|
237
|
-
return entity !== null
|
|
238
|
-
? this.assign([entity], {
|
|
239
|
-
reset: true,
|
|
240
|
-
add: add ?? true,
|
|
241
|
-
merge: merge ?? true,
|
|
242
|
-
remove: remove ?? false,
|
|
243
|
-
})[0]
|
|
244
|
-
: null;
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Save all models in the collection
|
|
249
|
-
* @param relModel The model is relationship
|
|
250
|
-
* @param method The method to use
|
|
251
|
-
* @param options HttpOptions
|
|
252
|
-
*/
|
|
253
|
-
save({ relModel = false, method, ...options } = {}) {
|
|
254
|
-
const resource = this.resource();
|
|
255
|
-
if (resource instanceof ODataPropertyResource)
|
|
256
|
-
return throwError(() => new Error('save: Resource is ODataPropertyResource'));
|
|
257
|
-
const toDestroyEntity = [];
|
|
258
|
-
const toRemoveReference = [];
|
|
259
|
-
const toDestroyContained = [];
|
|
260
|
-
const toCreateEntity = [];
|
|
261
|
-
const toAddReference = [];
|
|
262
|
-
const toCreateContained = [];
|
|
263
|
-
const toUpdateEntity = [];
|
|
264
|
-
const toUpdateContained = [];
|
|
265
|
-
this._entries.forEach(({ model, state }) => {
|
|
266
|
-
if (state === ODataModelState.Removed) {
|
|
267
|
-
if (relModel) {
|
|
268
|
-
toDestroyEntity.push(model);
|
|
269
|
-
}
|
|
270
|
-
else if (!model.isNew()) {
|
|
271
|
-
toRemoveReference.push(model);
|
|
272
|
-
}
|
|
273
|
-
else {
|
|
274
|
-
toDestroyContained.push(model);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
else if (state === ODataModelState.Added) {
|
|
278
|
-
if (relModel) {
|
|
279
|
-
toCreateEntity.push(model);
|
|
280
|
-
}
|
|
281
|
-
else if (!model.isNew()) {
|
|
282
|
-
toAddReference.push(model);
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
toCreateContained.push(model);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
else if (model.hasChanged()) {
|
|
289
|
-
toUpdateEntity.push(model);
|
|
290
|
-
}
|
|
291
|
-
});
|
|
292
|
-
const obs$ = forkJoin([
|
|
293
|
-
...toDestroyEntity.map((m) => m.asEntity((e) => e.destroy(options))),
|
|
294
|
-
...toRemoveReference.map((m) => (this._model.meta.api.options.deleteRefBy === 'path'
|
|
295
|
-
? resource.key(m.key())
|
|
296
|
-
: resource)
|
|
297
|
-
.reference()
|
|
298
|
-
.remove(this._model.meta.api.options.deleteRefBy === 'id'
|
|
299
|
-
? m.asEntity((e) => e.resource())
|
|
300
|
-
: undefined, options)),
|
|
301
|
-
...toDestroyContained.map((m) => m.destroy(options)),
|
|
302
|
-
...toCreateEntity.map((m) => m.asEntity((e) => e.save({ method: 'create', ...options }))),
|
|
303
|
-
...toAddReference.map((m) => resource
|
|
304
|
-
.reference()
|
|
305
|
-
.add(m.asEntity((e) => e.resource()), options)),
|
|
306
|
-
...toCreateContained.map((m) => m.save({ method: 'create', ...options })),
|
|
307
|
-
...toUpdateEntity.map((m) => m.asEntity((e) => e.save({ method, ...options }))),
|
|
308
|
-
...toUpdateContained.map((m) => m.save({ method, ...options })),
|
|
309
|
-
]).pipe(defaultIfEmpty(null));
|
|
310
|
-
return this._request(obs$, () => {
|
|
311
|
-
this._entries = this._entries
|
|
312
|
-
.filter((entry) => entry.state !== ODataModelState.Removed)
|
|
313
|
-
.map((entry) => ({ ...entry, state: ODataModelState.Unchanged }));
|
|
314
|
-
return this.models();
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
_addServer(model, options) {
|
|
318
|
-
const resource = this.resource();
|
|
319
|
-
if (resource instanceof ODataNavigationPropertyResource) {
|
|
320
|
-
if (!model.isNew()) {
|
|
321
|
-
// Add Reference
|
|
322
|
-
return resource
|
|
323
|
-
.reference()
|
|
324
|
-
.add(model.asEntity((e) => e.resource()), options)
|
|
325
|
-
.pipe(map(() => model));
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
// Create Contained
|
|
329
|
-
return resource.create(model.toEntity(), options).pipe(map(({ entity }) => {
|
|
330
|
-
if (entity) {
|
|
331
|
-
model.assign(entity);
|
|
332
|
-
}
|
|
333
|
-
return model;
|
|
334
|
-
}));
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
else if (resource instanceof ODataEntitySetResource) {
|
|
338
|
-
return model.asEntity((e) => e.save({ method: 'create', ...options }));
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
return of(model);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
_addModel(model, { silent = false, reset = false, reparent = false, merge = false, position, } = {}) {
|
|
345
|
-
let entry = this._findEntry(model);
|
|
346
|
-
if (entry !== undefined && entry.state !== ODataModelState.Removed) {
|
|
347
|
-
if (merge) {
|
|
348
|
-
entry.model.assign(model.toEntity(INCLUDE_DEEP));
|
|
349
|
-
}
|
|
350
|
-
return entry.model;
|
|
351
|
-
}
|
|
352
|
-
if (entry !== undefined && entry.state === ODataModelState.Removed) {
|
|
353
|
-
const index = this._entries.indexOf(entry);
|
|
354
|
-
this._entries.splice(index, 1);
|
|
355
|
-
}
|
|
356
|
-
// Create Entry
|
|
357
|
-
entry = {
|
|
358
|
-
state: reset ? ODataModelState.Unchanged : ODataModelState.Added,
|
|
359
|
-
model,
|
|
360
|
-
key: model.key(),
|
|
361
|
-
};
|
|
362
|
-
// Set Parent
|
|
363
|
-
if (reparent)
|
|
364
|
-
model._parent = [this, null];
|
|
365
|
-
// Subscribe
|
|
366
|
-
this._link(entry);
|
|
367
|
-
// If position is undefined and the collection is sorted, find the right position
|
|
368
|
-
if (position === undefined && this._sortBy !== null) {
|
|
369
|
-
for (let index = 0; index < this._entries.length; index++) {
|
|
370
|
-
if (this._compare(model, this._entries[index], this._sortBy, 0) < 0) {
|
|
371
|
-
position = index;
|
|
372
|
-
break;
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
// Now add
|
|
377
|
-
if (position !== undefined)
|
|
378
|
-
this._entries.splice(position, 0, entry);
|
|
379
|
-
else
|
|
380
|
-
this._entries.push(entry);
|
|
381
|
-
if (!silent) {
|
|
382
|
-
model.events$.trigger(ODataModelEventType.Add, {
|
|
383
|
-
collection: this,
|
|
384
|
-
options: { index: position },
|
|
385
|
-
});
|
|
386
|
-
}
|
|
387
|
-
return entry.model;
|
|
388
|
-
}
|
|
389
|
-
add(model, { silent = false, reparent = false, server = true, merge = false, position, reset, } = {}) {
|
|
390
|
-
const _addModel = (m, reset) => this._addModel(m, { silent, position, merge, reparent, reset });
|
|
391
|
-
return server
|
|
392
|
-
? this._request(this._addServer(model), (model) => _addModel(model, reset ?? true))
|
|
393
|
-
: of(_addModel(model, reset ?? false));
|
|
394
|
-
}
|
|
395
|
-
_removeServer(model, options) {
|
|
396
|
-
let resource = this.resource();
|
|
397
|
-
if (resource instanceof ODataNavigationPropertyResource) {
|
|
398
|
-
if (!model.isNew()) {
|
|
399
|
-
// Remove Reference
|
|
400
|
-
const target = this._model.meta.api.options.deleteRefBy === 'id'
|
|
401
|
-
? model.asEntity((e) => e.resource())
|
|
402
|
-
: undefined;
|
|
403
|
-
if (this._model.meta.api.options.deleteRefBy === 'path') {
|
|
404
|
-
resource = resource.key(model.key());
|
|
405
|
-
}
|
|
406
|
-
return resource
|
|
407
|
-
.reference()
|
|
408
|
-
.remove(target, options)
|
|
409
|
-
.pipe(map(() => model));
|
|
410
|
-
}
|
|
411
|
-
else {
|
|
412
|
-
// Remove Contained
|
|
413
|
-
return resource.destroy(options).pipe(map(() => model));
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
else if (resource instanceof ODataEntitySetResource) {
|
|
417
|
-
return model.asEntity((e) => e.destroy(options));
|
|
418
|
-
}
|
|
419
|
-
else {
|
|
420
|
-
return of(model);
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
_removeModel(model, { silent = false, reset = false, } = {}) {
|
|
424
|
-
const entry = this._findEntry(model);
|
|
425
|
-
if (entry === undefined || entry.state === ODataModelState.Removed) {
|
|
426
|
-
return model;
|
|
427
|
-
}
|
|
428
|
-
// Now remove
|
|
429
|
-
const index = this._entries.indexOf(entry);
|
|
430
|
-
this._entries.splice(index, 1);
|
|
431
|
-
if (!(reset || entry.state === ODataModelState.Added)) {
|
|
432
|
-
// Move to end of array and mark as removed
|
|
433
|
-
entry.state = ODataModelState.Removed;
|
|
434
|
-
this._entries.push(entry);
|
|
435
|
-
}
|
|
436
|
-
// Trigger Event
|
|
437
|
-
if (!silent) {
|
|
438
|
-
model.events$.trigger(ODataModelEventType.Remove, {
|
|
439
|
-
collection: this,
|
|
440
|
-
options: { index: index },
|
|
441
|
-
});
|
|
442
|
-
}
|
|
443
|
-
this._unlink(entry);
|
|
444
|
-
return entry.model;
|
|
445
|
-
}
|
|
446
|
-
remove(model, { silent = false, server = true, reset, } = {}) {
|
|
447
|
-
const _removeModel = (m, reset) => this._removeModel(m, { silent, reset });
|
|
448
|
-
return server
|
|
449
|
-
? this._request(this._removeServer(model), (model) => _removeModel(model, reset ?? true))
|
|
450
|
-
: of(_removeModel(model, reset ?? false));
|
|
451
|
-
}
|
|
452
|
-
_moveModel(model, position) {
|
|
453
|
-
const entry = this._findEntry(model);
|
|
454
|
-
if (entry === undefined || entry.state === ODataModelState.Removed) {
|
|
455
|
-
return model;
|
|
456
|
-
}
|
|
457
|
-
// Now remove
|
|
458
|
-
const index = this._entries.indexOf(entry);
|
|
459
|
-
this._entries.splice(index, 1);
|
|
460
|
-
this._entries.splice(position, 0, entry);
|
|
461
|
-
return entry.model;
|
|
462
|
-
}
|
|
463
|
-
create(attrs = {}, { silent = false, server = true, } = {}) {
|
|
464
|
-
const model = this.modelFactory(attrs);
|
|
465
|
-
return (model.isValid() && server ? model.save() : of(model)).pipe(switchMap((model) => this.add(model, { silent, server })), map(() => model));
|
|
466
|
-
}
|
|
467
|
-
set(path, value, {}) {
|
|
468
|
-
const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
|
|
469
|
-
if (pathArray.length === 0)
|
|
470
|
-
return undefined;
|
|
471
|
-
if (pathArray.length > 1) {
|
|
472
|
-
const model = this._entries[Number(pathArray[0])].model;
|
|
473
|
-
return model.set(pathArray.slice(1), value, {});
|
|
474
|
-
}
|
|
475
|
-
if (pathArray.length === 1 && ODataModelOptions.isModel(value)) {
|
|
476
|
-
const models = this.models();
|
|
477
|
-
const index = Number(pathArray[0]);
|
|
478
|
-
models[index] = value;
|
|
479
|
-
this.assign(models, { reparent: true });
|
|
480
|
-
return value;
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
get(path) {
|
|
484
|
-
const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
|
|
485
|
-
if (pathArray.length === 0)
|
|
486
|
-
return undefined;
|
|
487
|
-
const value = this.models()[Number(pathArray[0])];
|
|
488
|
-
if (pathArray.length > 1 && ODataModelOptions.isModel(value)) {
|
|
489
|
-
return value.get(pathArray.slice(1));
|
|
490
|
-
}
|
|
491
|
-
return value;
|
|
492
|
-
}
|
|
493
|
-
has(path) {
|
|
494
|
-
const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
|
|
495
|
-
if (pathArray.length === 0)
|
|
496
|
-
return false;
|
|
497
|
-
const value = this.models()[Number(pathArray[0])];
|
|
498
|
-
if (pathArray.length > 1 && ODataModelOptions.isModel(value)) {
|
|
499
|
-
return value.has(pathArray.slice(1));
|
|
500
|
-
}
|
|
501
|
-
return value !== undefined;
|
|
502
|
-
}
|
|
503
|
-
reset({ path, silent = false, } = {}) {
|
|
504
|
-
let toAdd = [];
|
|
505
|
-
let toChange = [];
|
|
506
|
-
let toRemove = [];
|
|
507
|
-
if (path !== undefined) {
|
|
508
|
-
// Reset by path
|
|
509
|
-
const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
|
|
510
|
-
const index = Number(pathArray[0]);
|
|
511
|
-
if (!Number.isNaN(index)) {
|
|
512
|
-
const model = this.models()[index];
|
|
513
|
-
if (ODataModelOptions.isModel(model)) {
|
|
514
|
-
const entry = this._findEntry(model);
|
|
515
|
-
if (entry.state === ODataModelState.Unchanged &&
|
|
516
|
-
entry.model.hasChanged()) {
|
|
517
|
-
toChange = [entry];
|
|
518
|
-
}
|
|
519
|
-
path = pathArray.slice(1);
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
else {
|
|
524
|
-
// Reset all
|
|
525
|
-
toAdd = this._entries.filter((e) => e.state === ODataModelState.Removed);
|
|
526
|
-
toChange = this._entries.filter((e) => e.state === ODataModelState.Unchanged && e.model.hasChanged());
|
|
527
|
-
toRemove = this._entries.filter((e) => e.state === ODataModelState.Added);
|
|
528
|
-
}
|
|
529
|
-
toRemove.forEach((entry) => {
|
|
530
|
-
this._removeModel(entry.model, { silent });
|
|
531
|
-
});
|
|
532
|
-
toAdd.forEach((entry) => {
|
|
533
|
-
this._addModel(entry.model, { silent });
|
|
534
|
-
});
|
|
535
|
-
toChange.forEach((entry) => {
|
|
536
|
-
entry.model.reset({ path, silent });
|
|
537
|
-
entry.state = ODataModelState.Unchanged;
|
|
538
|
-
});
|
|
539
|
-
if (!silent &&
|
|
540
|
-
(toAdd.length > 0 || toRemove.length > 0 || toChange.length > 0)) {
|
|
541
|
-
this.events$.trigger(ODataModelEventType.Reset, {
|
|
542
|
-
options: {
|
|
543
|
-
added: toAdd.map((e) => e.model),
|
|
544
|
-
removed: toRemove.map((e) => e.model),
|
|
545
|
-
changed: toChange.map((e) => e.model),
|
|
546
|
-
},
|
|
547
|
-
});
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
clear({ silent = false } = {}) {
|
|
551
|
-
const toRemove = this.models();
|
|
552
|
-
toRemove.forEach((m) => {
|
|
553
|
-
this._removeModel(m, { silent });
|
|
554
|
-
});
|
|
555
|
-
this._entries = [];
|
|
556
|
-
if (!silent) {
|
|
557
|
-
this.events$.trigger(ODataModelEventType.Update, {
|
|
558
|
-
options: { removed: toRemove },
|
|
559
|
-
});
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
assign(objects, { add = true, merge = true, remove = true, reset = false, reparent = false, silent = false, } = {}) {
|
|
563
|
-
const offset = remove ? 0 : this.length;
|
|
564
|
-
const models = [];
|
|
565
|
-
const toAdd = [];
|
|
566
|
-
const toMerge = [];
|
|
567
|
-
const toRemove = [];
|
|
568
|
-
objects.forEach((obj, index) => {
|
|
569
|
-
const model = ODataModelOptions.isModel(obj)
|
|
570
|
-
? obj
|
|
571
|
-
: this.modelFactory(obj, {
|
|
572
|
-
reset,
|
|
573
|
-
});
|
|
574
|
-
const position = index + offset;
|
|
575
|
-
// Try find entry
|
|
576
|
-
const entry = this._findEntry(model);
|
|
577
|
-
if (merge && entry !== undefined) {
|
|
578
|
-
if (entry.model !== model) {
|
|
579
|
-
entry.model.assign(model.toEntity({
|
|
580
|
-
client_id: true,
|
|
581
|
-
...INCLUDE_DEEP,
|
|
582
|
-
}), { add, merge, remove, reset, silent });
|
|
583
|
-
// Model Change?
|
|
584
|
-
if (entry.model.hasChanged())
|
|
585
|
-
toMerge.push(entry.model);
|
|
586
|
-
}
|
|
587
|
-
if (reset)
|
|
588
|
-
entry.state = ODataModelState.Unchanged;
|
|
589
|
-
if (!models.includes(entry.model)) {
|
|
590
|
-
models.push(entry.model);
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
else if (add) {
|
|
594
|
-
// Add
|
|
595
|
-
toAdd.push(model);
|
|
596
|
-
this._addModel(model, { silent, reset, reparent, position });
|
|
597
|
-
models.push(model);
|
|
598
|
-
}
|
|
599
|
-
});
|
|
600
|
-
if (remove) {
|
|
601
|
-
[...this._entries].forEach((entry) => {
|
|
602
|
-
const model = entry.model;
|
|
603
|
-
if (!models.includes(model)) {
|
|
604
|
-
this._removeModel(model, { silent, reset });
|
|
605
|
-
toRemove.push(model);
|
|
606
|
-
}
|
|
607
|
-
});
|
|
608
|
-
}
|
|
609
|
-
if (this.models()
|
|
610
|
-
.slice(offset)
|
|
611
|
-
.some((m, i) => m !== models[i])) {
|
|
612
|
-
models.forEach((m, i) => this._moveModel(m, i));
|
|
613
|
-
this.events$.trigger(ODataModelEventType.Sort);
|
|
614
|
-
}
|
|
615
|
-
if (!silent &&
|
|
616
|
-
(toAdd.length > 0 || toRemove.length > 0 || toMerge.length > 0)) {
|
|
617
|
-
this.events$.trigger(reset ? ODataModelEventType.Reset : ODataModelEventType.Update, {
|
|
618
|
-
options: {
|
|
619
|
-
added: toAdd,
|
|
620
|
-
removed: toRemove,
|
|
621
|
-
merged: toMerge,
|
|
622
|
-
},
|
|
623
|
-
});
|
|
624
|
-
}
|
|
625
|
-
return models;
|
|
626
|
-
}
|
|
627
|
-
query(ctx) {
|
|
628
|
-
const resource = this.resource();
|
|
629
|
-
if (resource) {
|
|
630
|
-
resource.query(ctx);
|
|
631
|
-
this.attach(resource);
|
|
632
|
-
}
|
|
633
|
-
return this;
|
|
634
|
-
}
|
|
635
|
-
callFunction(name, params, responseType, options = {}) {
|
|
636
|
-
const resource = this.resource();
|
|
637
|
-
if (!(resource instanceof ODataEntitySetResource))
|
|
638
|
-
return throwError(() => new Error("callFunction: Can't call function without ODataEntitySetResource"));
|
|
639
|
-
const func = resource.function(name).query((q) => q.restore(options));
|
|
640
|
-
switch (responseType) {
|
|
641
|
-
case 'property':
|
|
642
|
-
return this._request(func.callProperty(params, options), (resp) => resp);
|
|
643
|
-
case 'model':
|
|
644
|
-
return this._request(func.callModel(params, options), (resp) => resp);
|
|
645
|
-
case 'collection':
|
|
646
|
-
return this._request(func.callCollection(params, options), (resp) => resp);
|
|
647
|
-
default:
|
|
648
|
-
return this._request(func.call(params, { responseType, ...options }), (resp) => resp);
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
callAction(name, params, responseType, options = {}) {
|
|
652
|
-
const resource = this.resource();
|
|
653
|
-
if (!(resource instanceof ODataEntitySetResource)) {
|
|
654
|
-
return throwError(() => new Error(`callAction: Can't call action without ODataEntitySetResource`));
|
|
655
|
-
}
|
|
656
|
-
const action = resource.action(name).query((q) => q.restore(options));
|
|
657
|
-
switch (responseType) {
|
|
658
|
-
case 'property':
|
|
659
|
-
return this._request(action.callProperty(params, options), (resp) => resp);
|
|
660
|
-
case 'model':
|
|
661
|
-
return this._request(action.callModel(params, options), (resp) => resp);
|
|
662
|
-
case 'collection':
|
|
663
|
-
return this._request(action.callCollection(params, options), (resp) => resp);
|
|
664
|
-
default:
|
|
665
|
-
return this._request(action.call(params, { responseType, ...options }), (resp) => resp);
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
_unlink(entry) {
|
|
669
|
-
if (entry.subscription) {
|
|
670
|
-
entry.subscription.unsubscribe();
|
|
671
|
-
entry.subscription = undefined;
|
|
672
|
-
}
|
|
673
|
-
}
|
|
674
|
-
_link(entry) {
|
|
675
|
-
if (entry.subscription) {
|
|
676
|
-
throw new Error('Collection: Subscription already exists');
|
|
677
|
-
}
|
|
678
|
-
entry.subscription = entry.model.events$.subscribe((event) => {
|
|
679
|
-
if (event.canContinueWith(this)) {
|
|
680
|
-
if (event.model === entry.model) {
|
|
681
|
-
if (event.type === ODataModelEventType.Destroy) {
|
|
682
|
-
this._removeModel(entry.model, { reset: true });
|
|
683
|
-
}
|
|
684
|
-
else if (event.type === ODataModelEventType.Change &&
|
|
685
|
-
event.options?.key) {
|
|
686
|
-
entry.key = entry.model.key();
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
const index = event.options?.index ?? this.models().indexOf(entry.model);
|
|
690
|
-
this.events$.emit(event.push(this, index));
|
|
691
|
-
}
|
|
692
|
-
});
|
|
693
|
-
}
|
|
694
|
-
_findEntry(model) {
|
|
695
|
-
return this._entries.find((entry) => (entry.key !== undefined &&
|
|
696
|
-
model.key() !== undefined &&
|
|
697
|
-
Types.isEqual(entry.key, model.key())) ||
|
|
698
|
-
entry.model.equals(model));
|
|
699
|
-
}
|
|
700
|
-
// Collection functions
|
|
701
|
-
equals(other) {
|
|
702
|
-
return this === other;
|
|
703
|
-
}
|
|
704
|
-
get [Symbol.toStringTag]() {
|
|
705
|
-
return 'Collection';
|
|
706
|
-
}
|
|
707
|
-
[Symbol.iterator]() {
|
|
708
|
-
let pointer = 0;
|
|
709
|
-
const models = this.models();
|
|
710
|
-
return {
|
|
711
|
-
next() {
|
|
712
|
-
return {
|
|
713
|
-
done: pointer === models.length,
|
|
714
|
-
value: models[pointer++],
|
|
715
|
-
};
|
|
716
|
-
},
|
|
717
|
-
};
|
|
718
|
-
}
|
|
719
|
-
filter(predicate, thisArg) {
|
|
720
|
-
return this.models().filter(predicate, thisArg);
|
|
721
|
-
}
|
|
722
|
-
map(callbackfn, thisArg) {
|
|
723
|
-
return this.models().map(callbackfn, thisArg);
|
|
724
|
-
}
|
|
725
|
-
find(predicate) {
|
|
726
|
-
return this.models().find(predicate);
|
|
727
|
-
}
|
|
728
|
-
reduce(callbackfn, initialValue) {
|
|
729
|
-
return this.models().reduce(callbackfn, initialValue);
|
|
730
|
-
}
|
|
731
|
-
first() {
|
|
732
|
-
return this.models()[0];
|
|
733
|
-
}
|
|
734
|
-
last() {
|
|
735
|
-
const models = this.models();
|
|
736
|
-
return models[models.length - 1];
|
|
737
|
-
}
|
|
738
|
-
next(model) {
|
|
739
|
-
const index = this.indexOf(model);
|
|
740
|
-
if (index === -1 || index === this.length - 1) {
|
|
741
|
-
return undefined;
|
|
742
|
-
}
|
|
743
|
-
return this.get(index + 1);
|
|
744
|
-
}
|
|
745
|
-
prev(model) {
|
|
746
|
-
const index = this.indexOf(model);
|
|
747
|
-
if (index <= 0) {
|
|
748
|
-
return undefined;
|
|
749
|
-
}
|
|
750
|
-
return this.get(index - 1);
|
|
751
|
-
}
|
|
752
|
-
every(predicate) {
|
|
753
|
-
return this.models().every(predicate);
|
|
754
|
-
}
|
|
755
|
-
some(predicate) {
|
|
756
|
-
return this.models().some(predicate);
|
|
757
|
-
}
|
|
758
|
-
includes(model, start = 0) {
|
|
759
|
-
return this.some((m, i) => i >= start && m.equals(model));
|
|
760
|
-
}
|
|
761
|
-
indexOf(model) {
|
|
762
|
-
const models = this.models();
|
|
763
|
-
const m = models.find((m) => m.equals(model));
|
|
764
|
-
return !m ? -1 : models.indexOf(m);
|
|
765
|
-
}
|
|
766
|
-
forEach(predicate, thisArg) {
|
|
767
|
-
return this.models().forEach(predicate, thisArg);
|
|
768
|
-
}
|
|
769
|
-
isEmpty() {
|
|
770
|
-
// Local length == 0 and if exist remote count is 0 or undefined
|
|
771
|
-
return this.length === 0 && !this.annots().count;
|
|
772
|
-
}
|
|
773
|
-
//#region Sort
|
|
774
|
-
_compare(e1, e2, by, index) {
|
|
775
|
-
const m1 = ODataModelOptions.isModel(e1)
|
|
776
|
-
? e1
|
|
777
|
-
: e1.model;
|
|
778
|
-
const m2 = ODataModelOptions.isModel(e2)
|
|
779
|
-
? e2
|
|
780
|
-
: e2.model;
|
|
781
|
-
const value1 = m1.get(by[index].field);
|
|
782
|
-
const value2 = m2.get(by[index].field);
|
|
783
|
-
let result = 0;
|
|
784
|
-
if (value1 == null && value2 != null)
|
|
785
|
-
result = -1;
|
|
786
|
-
else if (value1 != null && value2 == null)
|
|
787
|
-
result = 1;
|
|
788
|
-
else if (value1 == null && value2 == null)
|
|
789
|
-
result = 0;
|
|
790
|
-
else if (typeof value1 == 'string' || value1 instanceof String) {
|
|
791
|
-
if (value1.localeCompare && value1 != value2) {
|
|
792
|
-
return (by[index].order || 1) * value1.localeCompare(value2);
|
|
793
|
-
}
|
|
794
|
-
}
|
|
795
|
-
else {
|
|
796
|
-
result = value1 < value2 ? -1 : 1;
|
|
797
|
-
}
|
|
798
|
-
if (value1 == value2) {
|
|
799
|
-
return by.length - 1 > index ? this._compare(e1, e2, by, index + 1) : 0;
|
|
800
|
-
}
|
|
801
|
-
return (by[index].order || 1) * result;
|
|
802
|
-
}
|
|
803
|
-
isSorted() {
|
|
804
|
-
return this._sortBy !== null;
|
|
805
|
-
}
|
|
806
|
-
sort(by, { silent } = {}) {
|
|
807
|
-
this._sortBy = by;
|
|
808
|
-
this._entries = this._entries.sort((e1, e2) => this._compare(e1, e2, by, 0));
|
|
809
|
-
if (!silent) {
|
|
810
|
-
this.events$.trigger(ODataModelEventType.Sort);
|
|
811
|
-
}
|
|
812
|
-
}
|
|
813
|
-
}
|
|
814
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDeEMsT0FBTyxFQUdMLHNCQUFzQixFQUV0QiwrQkFBK0IsRUFFL0IscUJBQXFCLEdBR3RCLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQ0wsWUFBWSxFQUlaLHNCQUFzQixFQUN0QixtQkFBbUIsRUFFbkIsaUJBQWlCLEVBQ2pCLGVBQWUsR0FDaEIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixzQkFBc0IsR0FDdkIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLE9BQU8sZUFBZTthQUduQixVQUFLLEdBQTZCLElBQUksQUFBakMsQ0FBa0M7SUE2QjlDLE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxRQUFRO2FBQ2pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxlQUFlLENBQUMsT0FBTyxDQUFDO2FBQ2xELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJ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QUFFO1lBQzdDLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxDQUFDLEtBQVE7UUFDWCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtZQUNkLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQTJDO1FBQy9DLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBSSxDQUFDLFNBQTJDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQVEsRUFBRSxRQUFnQixDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxPQUFPLENBQUMsS0FBUTtRQUNkLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFP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QUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUMvQixDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hEO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVmYXVsdElmRW1wdHksIGZpbmFsaXplLCBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERFRkFVTFRfVkVSU0lPTiB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBPRGF0YUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcic7XG5pbXBvcnQge1xuICBPRGF0YUFjdGlvbk9wdGlvbnMsXG4gIE9EYXRhRW50aXR5UmVzb3VyY2UsXG4gIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UsXG4gIE9EYXRhRnVuY3Rpb25PcHRpb25zLFxuICBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YU9wdGlvbnMsXG4gIE9EYXRhUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyLFxuICBPRGF0YVJlc291cmNlLFxufSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgT0RhdGFTdHJ1Y3R1cmVkVHlwZSB9IGZyb20gJy4uL3NjaGVtYS9zdHJ1Y3R1cmVkLXR5cGUnO1xuaW1wb3J0IHsgVHlwZXMgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XG5pbXBvcnQgeyBPRGF0YU1vZGVsIH0gZnJvbSAnLi9tb2RlbCc7XG5pbXBvcnQge1xuICBJTkNMVURFX0RFRVAsXG4gIE1vZGVsRmllbGRPcHRpb25zLFxuICBPRGF0YU1vZGVsRW50cnksXG4gIE9EYXRhTW9kZWxFdmVudCxcbiAgT0RhdGFNb2RlbEV2ZW50RW1pdHRlcixcbiAgT0RhdGFNb2RlbEV2ZW50VHlwZSxcbiAgT0RhdGFNb2RlbEZpZWxkLFxuICBPRGF0YU1vZGVsT3B0aW9ucyxcbiAgT0RhdGFNb2RlbFN0YXRlLFxufSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHtcbiAgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zLFxuICBPRGF0YUVudGl0eUFubm90YXRpb25zLFxufSBmcm9tICcuLi9hbm5vdGF0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YUNvbGxlY3Rpb248VCwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+XG4gIGltcGxlbWVudHMgSXRlcmFibGU8TT5cbntcbiAgc3RhdGljIG1vZGVsOiB0eXBlb2YgT0RhdGFNb2RlbCB8IG51bGwgPSBudWxsO1xuICBfcGFyZW50OlxuICAgIHwgW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGwsXG4gICAgICBdXG4gICAgfCBudWxsID0gbnVsbDtcbiAgX3Jlc291cmNlOlxuICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBudWxsID0gbnVsbDtcbiAgX3Jlc291cmNlczoge1xuICAgIHBhcmVudDpcbiAgICAgIHwgW1xuICAgICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsLFxuICAgICAgICBdXG4gICAgICB8IG51bGw7XG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgbnVsbDtcbiAgfVtdID0gW107XG4gIF9hbm5vdGF0aW9ucyE6IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczxUPjtcbiAgX2VudHJpZXM6IE9EYXRhTW9kZWxFbnRyeTxULCBNPltdID0gW107XG4gIF9tb2RlbDogdHlwZW9mIE9EYXRhTW9kZWw7XG5cbiAgbW9kZWxzKCkge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzXG4gICAgICAuZmlsdGVyKChlKSA9PiBlLnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZClcbiAgICAgIC5tYXAoKGUpID0+IGUubW9kZWwpO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmxlbmd0aDtcbiAgfVxuXG4gIC8vRXZlbnRzXG4gIGV2ZW50cyQ6IE9EYXRhTW9kZWxFdmVudEVtaXR0ZXI8VD47XG4gIGNvbnN0cnVjdG9yKFxuICAgIGVudGl0aWVzOiBQYXJ0aWFsPFQ+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdID0gW10sXG4gICAge1xuICAgICAgcGFyZW50LFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBhbm5vdHMsXG4gICAgICBtb2RlbCxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgcGFyZW50PzogW09EYXRhTW9kZWw8YW55PiwgT0RhdGFNb2RlbEZpZWxkPGFueT5dO1xuICAgICAgcmVzb3VyY2U/OiBPRGF0YVJlc291cmNlPFQ+IHwgbnVsbDtcbiAgICAgIGFubm90cz86IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9uczxUPjtcbiAgICAgIG1vZGVsPzogdHlwZW9mIE9EYXRhTW9kZWw7XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICBjb25zdCBLbGFzcyA9IHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIE9EYXRhQ29sbGVjdGlvbjtcbiAgICBpZiAoIW1vZGVsICYmIEtsYXNzLm1vZGVsICE9PSBudWxsKSBtb2RlbCA9IEtsYXNzLm1vZGVsO1xuICAgIGlmICghbW9kZWwpIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbjogQ29sbGVjdGlvbiBuZWVkIG1vZGVsJyk7XG5cbiAgICB0aGlzLl9tb2RlbCA9IG1vZGVsO1xuXG4gICAgLy8gRXZlbnRzXG4gICAgdGhpcy5ldmVudHMkID0gbmV3IE9EYXRhTW9kZWxFdmVudEVtaXR0ZXI8VD4oeyBjb2xsZWN0aW9uOiB0aGlzIH0pO1xuICAgIHRoaXMuZXZlbnRzJC5zdWJzY3JpYmUoKGUpID0+IG1vZGVsIS5tZXRhLmV2ZW50cyQuZW1pdChlKSk7XG5cbiAgICAvLyBQYXJlbnRcbiAgICBpZiAocGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICB9XG5cbiAgICAvLyBSZXNvdXJjZVxuICAgIGlmICh0aGlzLl9wYXJlbnQgPT09IG51bGwgJiYgIXJlc291cmNlKVxuICAgICAgcmVzb3VyY2UgPSB0aGlzLl9tb2RlbC5tZXRhLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoKSBhc1xuICAgICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgdGhpcy5hdHRhY2goXG4gICAgICAgIHJlc291cmNlIGFzXG4gICAgICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD4sXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEFubm90YXRpb25zXG4gICAgdGhpcy5fYW5ub3RhdGlvbnMgPVxuICAgICAgYW5ub3RzIHx8XG4gICAgICBuZXcgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zKFxuICAgICAgICBPRGF0YUhlbHBlcltyZXNvdXJjZT8uYXBpPy5vcHRpb25zLnZlcnNpb24gfHwgREVGQVVMVF9WRVJTSU9OXSxcbiAgICAgICk7XG5cbiAgICBlbnRpdGllcyA9IGVudGl0aWVzIHx8IFtdO1xuICAgIHRoaXMuYXNzaWduKGVudGl0aWVzLCB7IHJlc2V0IH0pO1xuICB9XG5cbiAgaXNQYXJlbnRPZihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoaWxkICE9PSB0aGlzICYmXG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5jaGFpbihjaGlsZCkuc29tZSgocCkgPT4gcFswXSA9PT0gdGhpcylcbiAgICApO1xuICB9XG5cbiAgcmVzb3VyY2UoKTpcbiAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgbnVsbCB7XG4gICAgcmV0dXJuIE9EYXRhTW9kZWxPcHRpb25zLnJlc291cmNlPFQ+KHRoaXMpIGFzXG4gICAgICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgbnVsbDtcbiAgfVxuXG4gIHB1c2hSZXNvdXJjZShcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBudWxsLFxuICApIHtcbiAgICAvLyBQdXNoIGN1cnJlbnQgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIHRoaXMuX3Jlc291cmNlcy5wdXNoKHsgcGFyZW50OiB0aGlzLl9wYXJlbnQsIHJlc291cmNlOiB0aGlzLl9yZXNvdXJjZSB9KTtcbiAgICAvLyBSZXBsYWNlIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICB0aGlzLl9wYXJlbnQgPSBudWxsO1xuICAgIHRoaXMuX3Jlc291cmNlID0gcmVzb3VyY2U7XG4gIH1cblxuICBwb3BSZXNvdXJjZSgpIHtcbiAgICAvLyBQb3AgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIGNvbnN0IHBvcCA9IHRoaXMuX3Jlc291cmNlcy5wb3AoKTtcbiAgICBpZiAocG9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB7IHBhcmVudDogdGhpcy5fcGFyZW50LCByZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UgfTtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBvcC5wYXJlbnQ7XG4gICAgICB0aGlzLl9yZXNvdXJjZSA9IHBvcC5yZXNvdXJjZTtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgYXR0YWNoKFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+LFxuICApIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9yZXNvdXJjZSAhPT0gbnVsbCAmJlxuICAgICAgdGhpcy5fcmVzb3VyY2Uub3V0Z29pbmdUeXBlKCkgIT09IHJlc291cmNlLm91dGdvaW5nVHlwZSgpICYmXG4gICAgICAhdGhpcy5fcmVzb3VyY2UuaXNTdWJ0eXBlT2YocmVzb3VyY2UpXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYXR0YWNoOiBDYW4ndCByZWF0dGFjaCAke3RoaXMuX3Jlc291cmNlLm91dGdvaW5nVHlwZSgpfSB0byAke3Jlc291cmNlLm91dGdvaW5nVHlwZSgpfWAsXG4gICAgICApO1xuXG4gICAgdGhpcy5fZW50cmllcy5mb3JFYWNoKCh7IG1vZGVsIH0pID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsUmVzb3VyY2UgPSB0aGlzLl9tb2RlbC5tZXRhLm1vZGVsUmVzb3VyY2VGYWN0b3J5KFxuICAgICAgICByZXNvdXJjZS5jbG9uZVF1ZXJ5PFQ+KCksXG4gICAgICApIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD47XG4gICAgICBpZiAobW9kZWxSZXNvdXJjZSAhPT0gdW5kZWZpbmVkKSBtb2RlbC5hdHRhY2gobW9kZWxSZXNvdXJjZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fcmVzb3VyY2U7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgIWN1cnJlbnQuaXNFcXVhbFRvKHJlc291cmNlKSkge1xuICAgICAgdGhpcy5fcmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuQXR0YWNoLCB7XG4gICAgICAgIHByZXZpb3VzOiBjdXJyZW50LFxuICAgICAgICB2YWx1ZTogcmVzb3VyY2UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgd2l0aFJlc291cmNlPFI+KFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IG51bGwsXG4gICAgY3R4OiAoY29sbGVjdGlvbjogdGhpcykgPT4gUixcbiAgKTogUiB7XG4gICAgLy8gUHVzaFxuICAgIHRoaXMucHVzaFJlc291cmNlKHJlc291cmNlKTtcbiAgICAvLyBFeGVjdXRlXG4gICAgY29uc3QgcmVzdWx0ID0gY3R4KHRoaXMpO1xuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICByZXR1cm4gKHJlc3VsdCBhcyBhbnkpLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5wb3BSZXNvdXJjZSgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBvcFxuICAgICAgdGhpcy5wb3BSZXNvdXJjZSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICBhc0VudGl0eVNldDxSPihjdHg6IChjb2xsZWN0aW9uOiB0aGlzKSA9PiBSKTogUiB7XG4gICAgLy8gQnVpbGQgbmV3IHJlc291cmNlXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLl9tb2RlbC5tZXRhLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoXG4gICAgICB0aGlzLl9yZXNvdXJjZT8uY2xvbmVRdWVyeTxUPigpLFxuICAgICkgYXNcbiAgICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPjtcbiAgICByZXR1cm4gdGhpcy53aXRoUmVzb3VyY2UocmVzb3VyY2UsIGN0eCk7XG4gIH1cblxuICBhbm5vdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBtb2RlbEZhY3RvcnkoXG4gICAgZGF0YTogUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHsgcmVzZXQgPSBmYWxzZSB9OiB7IHJlc2V0PzogYm9vbGVhbiB9ID0ge30sXG4gICk6IE0ge1xuICAgIGxldCBNb2RlbCA9IHRoaXMuX21vZGVsO1xuICAgIGNvbnN0IGFubm90cyA9IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zKHRoaXMuX2Fubm90YXRpb25zLmhlbHBlcik7XG4gICAgYW5ub3RzLnVwZGF0ZShkYXRhKTtcblxuICAgIGlmIChhbm5vdHM/LnR5cGUgIT09IHVuZGVmaW5lZCAmJiBNb2RlbC5tZXRhICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzY2hlbWEgPSBNb2RlbC5tZXRhLmZpbmRDaGlsZE9wdGlvbnMoKG8pID0+XG4gICAgICAgIG8uaXNUeXBlT2YoYW5ub3RzLnR5cGUgYXMgc3RyaW5nKSxcbiAgICAgICk/LnN0cnVjdHVyZWRUeXBlO1xuICAgICAgaWYgKHNjaGVtYSAhPT0gdW5kZWZpbmVkICYmIHNjaGVtYS5tb2RlbCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAvLyBDaGFuZ2UgdG8gY2hpbGQgbW9kZWxcbiAgICAgICAgTW9kZWwgPSBzY2hlbWEubW9kZWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbChkYXRhLCB7XG4gICAgICBhbm5vdHMsXG4gICAgICByZXNldCxcbiAgICAgIHBhcmVudDogW3RoaXMsIG51bGxdLFxuICAgIH0pIGFzIE07XG4gIH1cblxuICB0b0VudGl0aWVzKHtcbiAgICBjbGllbnRfaWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5ID0gZmFsc2UsXG4gICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfa2V5ID0gdHJ1ZSxcbiAgICBpbmNsdWRlX2lkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICBjaGFuZ2VzX29ubHkgPSBmYWxzZSxcbiAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgY2hhaW4gPSBbXSxcbiAgfToge1xuICAgIGNsaWVudF9pZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2tleT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9pZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9ub25fZmllbGQ/OiBib29sZWFuO1xuICAgIGNoYW5nZXNfb25seT86IGJvb2xlYW47XG4gICAgZmllbGRfbWFwcGluZz86IGJvb2xlYW47XG4gICAgY2hhaW4/OiAoT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PilbXTtcbiAgfSA9IHt9KTogKFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh7IG1vZGVsLCBzdGF0ZSB9KSA9PlxuICAgICAgICAgIHN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCAmJiBjaGFpbi5ldmVyeSgoYykgPT4gYyAhPT0gbW9kZWwpLFxuICAgICAgKVxuICAgICAgLm1hcCgoeyBtb2RlbCwgc3RhdGUgfSkgPT4ge1xuICAgICAgICB2YXIgY2hhbmdlc09ubHkgPSBjaGFuZ2VzX29ubHkgJiYgc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZDtcbiAgICAgICAgcmV0dXJuIG1vZGVsLnRvRW50aXR5KHtcbiAgICAgICAgICBjbGllbnRfaWQsXG4gICAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICAgICAgaW5jbHVkZV9jb21wdXRlZCxcbiAgICAgICAgICBpbmNsdWRlX2tleSxcbiAgICAgICAgICBpbmNsdWRlX2lkLFxuICAgICAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkLFxuICAgICAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICAgICAgY2hhbmdlc19vbmx5OiBjaGFuZ2VzT25seSxcbiAgICAgICAgICBjaGFpbjogW3RoaXMsIC4uLmNoYWluXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHRvSnNvbigpIHtcbiAgICByZXR1cm4gdGhpcy50b0VudGl0aWVzKElOQ0xVREVfREVFUCk7XG4gIH1cblxuICBoYXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fZW50cmllcy5zb21lKChlKSA9PiBlLnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkKSB8fFxuICAgICAgdGhpcy5tb2RlbHMoKS5zb21lKChtKSA9PiBtLmhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfSkpXG4gICAgKTtcbiAgfVxuXG4gIGNsb25lPEMgZXh0ZW5kcyBPRGF0YUNvbGxlY3Rpb248VCwgTT4+KCkge1xuICAgIHJldHVybiBuZXcgKDx0eXBlb2YgT0RhdGFDb2xsZWN0aW9uPnRoaXMuY29uc3RydWN0b3IpKFxuICAgICAgdGhpcy50b0VudGl0aWVzKElOQ0xVREVfREVFUCksXG4gICAgICB7XG4gICAgICAgIHJlc291cmNlOiB0aGlzLnJlc291cmNlKCksXG4gICAgICAgIGFubm90czogdGhpcy5hbm5vdHMoKSxcbiAgICAgIH0sXG4gICAgKSBhcyBDO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWVzdDxULCBSPihcbiAgICBvYnMkOiBPYnNlcnZhYmxlPFQ+LFxuICAgIG1hcENhbGxiYWNrOiAocmVzcG9uc2U6IFQpID0+IFIsXG4gICk6IE9ic2VydmFibGU8Uj4ge1xuICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuUmVxdWVzdCwge1xuICAgICAgb3B0aW9uczogeyBvYnNlcnZhYmxlOiBvYnMkIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgIG1hcCgocmVzcG9uc2UpID0+IG1hcENhbGxiYWNrKHJlc3BvbnNlKSksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLlN5bmMpKSxcbiAgICApO1xuICB9XG5cbiAgZmV0Y2goe1xuICAgIGFkZCxcbiAgICBtZXJnZSxcbiAgICByZW1vdmUsXG4gICAgd2l0aENvdW50LFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIGFkZD86IGJvb2xlYW47XG4gICAgbWVyZ2U/OiBib29sZWFuO1xuICAgIHJlbW92ZT86IGJvb2xlYW47XG4gICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgfSA9IHt9KTogT2JzZXJ2YWJsZTxNW10+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIXJlc291cmNlKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdmZXRjaDogUmVzb3VyY2UgaXMgbnVsbCcpKTtcblxuICAgIGNvbnN0IG9icyQgPVxuICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlXG4gICAgICAgID8gcmVzb3VyY2UuZmV0Y2goeyB3aXRoQ291bnQsIC4uLm9wdGlvbnMgfSlcbiAgICAgICAgOiByZXNvdXJjZS5mZXRjaCh7XG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdlbnRpdGllcycsXG4gICAgICAgICAgICB3aXRoQ291bnQsXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCwgKHsgZW50aXRpZXMsIGFubm90cyB9KSA9PiB7XG4gICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90cztcbiAgICAgIHJldHVybiBlbnRpdGllcyAhPT0gbnVsbFxuICAgICAgICA/IHRoaXMuYXNzaWduKGVudGl0aWVzLCB7XG4gICAgICAgICAgICByZXNldDogdHJ1ZSxcbiAgICAgICAgICAgIGFkZDogYWRkID8/IHRydWUsXG4gICAgICAgICAgICBtZXJnZTogbWVyZ2UgPz8gdHJ1ZSxcbiAgICAgICAgICAgIHJlbW92ZTogcmVtb3ZlID8/IHRydWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcbiAgfVxuXG4gIGZldGNoQWxsKHtcbiAgICBhZGQsXG4gICAgbWVyZ2UsXG4gICAgcmVtb3ZlLFxuICAgIHdpdGhDb3VudCxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBhZGQ/OiBib29sZWFuO1xuICAgIG1lcmdlPzogYm9vbGVhbjtcbiAgICByZW1vdmU/OiBib29sZWFuO1xuICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8TVtdPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCFyZXNvdXJjZSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignZmV0Y2hBbGw6IFJlc291cmNlIGlzIG51bGwnKSk7XG5cbiAgICBjb25zdCBvYnMkID0gcmVzb3VyY2UuZmV0Y2hBbGwoeyB3aXRoQ291bnQsIC4uLm9wdGlvbnMgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkLCAoeyBlbnRpdGllcywgYW5ub3RzIH0pID0+IHtcbiAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgcmV0dXJuIGVudGl0aWVzICE9PSBudWxsXG4gICAgICAgID8gdGhpcy5hc3NpZ24oZW50aXRpZXMsIHtcbiAgICAgICAgICAgIHJlc2V0OiB0cnVlLFxuICAgICAgICAgICAgYWRkOiBhZGQgPz8gdHJ1ZSxcbiAgICAgICAgICAgIG1lcmdlOiBtZXJnZSA/PyB0cnVlLFxuICAgICAgICAgICAgcmVtb3ZlOiByZW1vdmUgPz8gdHJ1ZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFtdO1xuICAgIH0pO1xuICB9XG5cbiAgZmV0Y2hNYW55KFxuICAgIHRvcDogbnVtYmVyLFxuICAgIHtcbiAgICAgIGFkZCxcbiAgICAgIG1lcmdlLFxuICAgICAgcmVtb3ZlLFxuICAgICAgd2l0aENvdW50LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGFkZD86IGJvb2xlYW47XG4gICAgICBtZXJnZT86IGJvb2xlYW47XG4gICAgICByZW1vdmU/OiBib29sZWFuO1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICk6IE9ic2VydmFibGU8TVtdPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCFyZXNvdXJjZSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignZmV0Y2hNYW55OiBSZXNvdXJjZSBpcyBudWxsJykpO1xuXG4gICAgcmVzb3VyY2UucXVlcnkoKHEpID0+XG4gICAgICByZW1vdmUgfHwgdGhpcy5sZW5ndGggPT0gMCA/IHEuc2tpcCgpLmNsZWFyKCkgOiBxLnNraXAodGhpcy5sZW5ndGgpLFxuICAgICk7XG5cbiAgICBjb25zdCBvYnMkID0gcmVzb3VyY2UuZmV0Y2hNYW55KHRvcCwgeyB3aXRoQ291bnQsIC4uLm9wdGlvbnMgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkLCAoeyBlbnRpdGllcywgYW5ub3RzIH0pID0+IHtcbiAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgcmV0dXJuIGVudGl0aWVzICE9PSBudWxsXG4gICAgICAgID8gdGhpcy5hc3NpZ24oZW50aXRpZXMsIHtcbiAgICAgICAgICAgIHJlc2V0OiB0cnVlLFxuICAgICAgICAgICAgYWRkOiBhZGQgPz8gdHJ1ZSxcbiAgICAgICAgICAgIG1lcmdlOiBtZXJnZSA/PyB0cnVlLFxuICAgICAgICAgICAgcmVtb3ZlOiByZW1vdmUgPz8gZmFsc2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcbiAgfVxuXG4gIGZldGNoT25lKHtcbiAgICBhZGQsXG4gICAgbWVyZ2UsXG4gICAgcmVtb3ZlLFxuICAgIHdpdGhDb3VudCxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBhZGQ/OiBib29sZWFuO1xuICAgIG1lcmdlPzogYm9vbGVhbjtcbiAgICByZW1vdmU/OiBib29sZWFuO1xuICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghcmVzb3VyY2UpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ2ZldGNoT25lOiBSZXNvdXJjZSBpcyBudWxsJykpO1xuXG4gICAgcmVzb3VyY2UucXVlcnkoKHEpID0+XG4gICAgICByZW1vdmUgfHwgdGhpcy5sZW5ndGggPT0gMCA/IHEuc2tpcCgpLmNsZWFyKCkgOiBxLnNraXAodGhpcy5sZW5ndGgpLFxuICAgICk7XG5cbiAgICBjb25zdCBvYnMkID0gcmVzb3VyY2UuZmV0Y2hPbmUoeyB3aXRoQ291bnQsIC4uLm9wdGlvbnMgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkLCAoeyBlbnRpdHksIGFubm90cyB9KSA9PiB7XG4gICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90cztcbiAgICAgIHJldHVybiBlbnRpdHkgIT09IG51bGxcbiAgICAgICAgPyB0aGlzLmFzc2lnbihbZW50aXR5XSwge1xuICAgICAgICAgICAgcmVzZXQ6IHRydWUsXG4gICAgICAgICAgICBhZGQ6IGFkZCA/PyB0cnVlLFxuICAgICAgICAgICAgbWVyZ2U6IG1lcmdlID8/IHRydWUsXG4gICAgICAgICAgICByZW1vdmU6IHJlbW92ZSA/PyBmYWxzZSxcbiAgICAgICAgICB9KVswXVxuICAgICAgICA6IG51bGw7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhbGwgbW9kZWxzIGluIHRoZSBjb2xsZWN0aW9uXG4gICAqIEBwYXJhbSByZWxNb2RlbCBUaGUgbW9kZWwgaXMgcmVsYXRpb25zaGlwXG4gICAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCB0byB1c2VcbiAgICogQHBhcmFtIG9wdGlvbnMgSHR0cE9wdGlvbnNcbiAgICovXG4gIHNhdmUoe1xuICAgIHJlbE1vZGVsID0gZmFsc2UsXG4gICAgbWV0aG9kLFxuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIHJlbE1vZGVsPzogYm9vbGVhbjtcbiAgICBtZXRob2Q/OiAndXBkYXRlJyB8ICdtb2RpZnknO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPE1bXT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhUHJvcGVydHlSZXNvdXJjZSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PiBuZXcgRXJyb3IoJ3NhdmU6IFJlc291cmNlIGlzIE9EYXRhUHJvcGVydHlSZXNvdXJjZScpLFxuICAgICAgKTtcblxuICAgIGNvbnN0IHRvRGVzdHJveUVudGl0eTogTVtdID0gW107XG4gICAgY29uc3QgdG9SZW1vdmVSZWZlcmVuY2U6IE1bXSA9IFtdO1xuICAgIGNvbnN0IHRvRGVzdHJveUNvbnRhaW5lZDogTVtdID0gW107XG4gICAgY29uc3QgdG9DcmVhdGVFbnRpdHk6IE1bXSA9IFtdO1xuICAgIGNvbnN0IHRvQWRkUmVmZXJlbmNlOiBNW10gPSBbXTtcbiAgICBjb25zdCB0b0NyZWF0ZUNvbnRhaW5lZDogTVtdID0gW107XG4gICAgY29uc3QgdG9VcGRhdGVFbnRpdHk6IE1bXSA9IFtdO1xuICAgIGNvbnN0IHRvVXBkYXRlQ29udGFpbmVkOiBNW10gPSBbXTtcblxuICAgIHRoaXMuX2VudHJpZXMuZm9yRWFjaCgoeyBtb2RlbCwgc3RhdGUgfSkgPT4ge1xuICAgICAgaWYgKHN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgICBpZiAocmVsTW9kZWwpIHtcbiAgICAgICAgICB0b0Rlc3Ryb3lFbnRpdHkucHVzaChtb2RlbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIW1vZGVsLmlzTmV3KCkpIHtcbiAgICAgICAgICB0b1JlbW92ZVJlZmVyZW5jZS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b0Rlc3Ryb3lDb250YWluZWQucHVzaChtb2RlbCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCkge1xuICAgICAgICBpZiAocmVsTW9kZWwpIHtcbiAgICAgICAgICB0b0NyZWF0ZUVudGl0eS5wdXNoKG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIGlmICghbW9kZWwuaXNOZXcoKSkge1xuICAgICAgICAgIHRvQWRkUmVmZXJlbmNlLnB1c2gobW9kZWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvQ3JlYXRlQ29udGFpbmVkLnB1c2gobW9kZWwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1vZGVsLmhhc0NoYW5nZWQoKSkge1xuICAgICAgICB0b1VwZGF0ZUVudGl0eS5wdXNoKG1vZGVsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBvYnMkID0gZm9ya0pvaW4oW1xuICAgICAgLi4udG9EZXN0cm95RW50aXR5Lm1hcCgobSkgPT4gbS5hc0VudGl0eSgoZSkgPT4gZS5kZXN0cm95KG9wdGlvbnMpKSksXG4gICAgICAuLi50b1JlbW92ZVJlZmVyZW5jZS5tYXAoKG0pID0+XG4gICAgICAgICh0aGlzLl9tb2RlbC5tZXRhLmFwaS5vcHRpb25zLmRlbGV0ZVJlZkJ5ID09PSAncGF0aCdcbiAgICAgICAgICA/IChyZXNvdXJjZSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+KS5rZXkobS5rZXkoKSlcbiAgICAgICAgICA6IChyZXNvdXJjZSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+KVxuICAgICAgICApXG4gICAgICAgICAgLnJlZmVyZW5jZSgpXG4gICAgICAgICAgLnJlbW92ZShcbiAgICAgICAgICAgIHRoaXMuX21vZGVsLm1ldGEuYXBpLm9wdGlvbnMuZGVsZXRlUmVmQnkgPT09ICdpZCdcbiAgICAgICAgICAgICAgPyAobS5hc0VudGl0eSgoZSkgPT4gZS5yZXNvdXJjZSgpKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+KVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgKSxcbiAgICAgICksXG4gICAgICAuLi50b0Rlc3Ryb3lDb250YWluZWQubWFwKChtKSA9PiBtLmRlc3Ryb3kob3B0aW9ucykpLFxuICAgICAgLi4udG9DcmVhdGVFbnRpdHkubWFwKChtKSA9PlxuICAgICAgICBtLmFzRW50aXR5KChlKSA9PiBlLnNhdmUoeyBtZXRob2Q6ICdjcmVhdGUnLCAuLi5vcHRpb25zIH0pKSxcbiAgICAgICksXG4gICAgICAuLi50b0FkZFJlZmVyZW5jZS5tYXAoKG0pID0+XG4gICAgICAgIChyZXNvdXJjZSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+KVxuICAgICAgICAgIC5yZWZlcmVuY2UoKVxuICAgICAgICAgIC5hZGQoXG4gICAgICAgICAgICBtLmFzRW50aXR5KChlKSA9PiBlLnJlc291cmNlKCkpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD4sXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICksXG4gICAgICApLFxuICAgICAgLi4udG9DcmVhdGVDb250YWluZWQubWFwKChtKSA9PiBtLnNhdmUoeyBtZXRob2Q6ICdjcmVhdGUnLCAuLi5vcHRpb25zIH0pKSxcbiAgICAgIC4uLnRvVXBkYXRlRW50aXR5Lm1hcCgobSkgPT5cbiAgICAgICAgbS5hc0VudGl0eSgoZSkgPT4gZS5zYXZlKHsgbWV0aG9kLCAuLi5vcHRpb25zIH0pKSxcbiAgICAgICksXG4gICAgICAuLi50b1VwZGF0ZUNvbnRhaW5lZC5tYXAoKG0pID0+IG0uc2F2ZSh7IG1ldGhvZCwgLi4ub3B0aW9ucyB9KSksXG4gICAgXSkucGlwZShkZWZhdWx0SWZFbXB0eShudWxsKSk7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCwgKCkgPT4ge1xuICAgICAgdGhpcy5fZW50cmllcyA9IHRoaXMuX2VudHJpZXNcbiAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZClcbiAgICAgICAgLm1hcCgoZW50cnkpID0+ICh7IC4uLmVudHJ5LCBzdGF0ZTogT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCB9KSk7XG4gICAgICByZXR1cm4gdGhpcy5tb2RlbHMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZFNlcnZlcihtb2RlbDogTSwgb3B0aW9ucz86IE9EYXRhT3B0aW9ucyk6IE9ic2VydmFibGU8TT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UpIHtcbiAgICAgIGlmICghbW9kZWwuaXNOZXcoKSkge1xuICAgICAgICAvLyBBZGQgUmVmZXJlbmNlXG4gICAgICAgIHJldHVybiByZXNvdXJjZVxuICAgICAgICAgIC5yZWZlcmVuY2UoKVxuICAgICAgICAgIC5hZGQoXG4gICAgICAgICAgICBtb2RlbC5hc0VudGl0eSgoZSkgPT4gZS5yZXNvdXJjZSgpKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+LFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICApXG4gICAgICAgICAgLnBpcGUobWFwKCgpID0+IG1vZGVsKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDcmVhdGUgQ29udGFpbmVkXG4gICAgICAgIHJldHVybiByZXNvdXJjZS5jcmVhdGUobW9kZWwudG9FbnRpdHkoKSBhcyBQYXJ0aWFsPFQ+LCBvcHRpb25zKS5waXBlKFxuICAgICAgICAgIG1hcCgoeyBlbnRpdHkgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICAgICAgICBtb2RlbC5hc3NpZ24oZW50aXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtb2RlbDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkge1xuICAgICAgcmV0dXJuIG1vZGVsLmFzRW50aXR5KChlKSA9PiBlLnNhdmUoeyBtZXRob2Q6ICdjcmVhdGUnLCAuLi5vcHRpb25zIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9mKG1vZGVsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hZGRNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgbWVyZ2UgPSBmYWxzZSxcbiAgICAgIHBvc2l0aW9uLFxuICAgIH06IHtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBtZXJnZT86IGJvb2xlYW47XG4gICAgICBwb3NpdGlvbj86IG51bWJlcjtcbiAgICB9ID0ge30sXG4gICk6IE0ge1xuICAgIGxldCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeShtb2RlbCk7XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQgJiYgZW50cnkuc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKSB7XG4gICAgICBpZiAobWVyZ2UpIHtcbiAgICAgICAgZW50cnkubW9kZWwuYXNzaWduKG1vZGVsLnRvRW50aXR5KElOQ0xVREVfREVFUCkgYXMgVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnkubW9kZWw7XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQgJiYgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2VudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIEVudHJ5XG4gICAgZW50cnkgPSB7XG4gICAgICBzdGF0ZTogcmVzZXQgPyBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkIDogT0RhdGFNb2RlbFN0YXRlLkFkZGVkLFxuICAgICAgbW9kZWwsXG4gICAgICBrZXk6IG1vZGVsLmtleSgpLFxuICAgIH07XG4gICAgLy8gU2V0IFBhcmVudFxuICAgIGlmIChyZXBhcmVudCkgbW9kZWwuX3BhcmVudCA9IFt0aGlzLCBudWxsXTtcblxuICAgIC8vIFN1YnNjcmliZVxuICAgIHRoaXMuX2xpbmsoZW50cnkpO1xuXG4gICAgLy8gSWYgcG9zaXRpb24gaXMgdW5kZWZpbmVkIGFuZCB0aGUgY29sbGVjdGlvbiBpcyBzb3J0ZWQsIGZpbmQgdGhlIHJpZ2h0IHBvc2l0aW9uXG4gICAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQgJiYgdGhpcy5fc29ydEJ5ICE9PSBudWxsKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZW50cmllcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBhcmUobW9kZWwsIHRoaXMuX2VudHJpZXNbaW5kZXhdLCB0aGlzLl9zb3J0QnksIDApIDwgMCkge1xuICAgICAgICAgIHBvc2l0aW9uID0gaW5kZXg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOb3cgYWRkXG4gICAgaWYgKHBvc2l0aW9uICE9PSB1bmRlZmluZWQpIHRoaXMuX2VudHJpZXMuc3BsaWNlKHBvc2l0aW9uLCAwLCBlbnRyeSk7XG4gICAgZWxzZSB0aGlzLl9lbnRyaWVzLnB1c2goZW50cnkpO1xuXG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIG1vZGVsLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLkFkZCwge1xuICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICBvcHRpb25zOiB7IGluZGV4OiBwb3NpdGlvbiB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJ5Lm1vZGVsO1xuICB9XG5cbiAgYWRkKFxuICAgIG1vZGVsOiBNLFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgICBtZXJnZSA9IGZhbHNlLFxuICAgICAgcG9zaXRpb24sXG4gICAgICByZXNldCxcbiAgICB9OiB7XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgc2VydmVyPzogYm9vbGVhbjtcbiAgICAgIG1lcmdlPzogYm9vbGVhbjtcbiAgICAgIHBvc2l0aW9uPzogbnVtYmVyO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxNPiB7XG4gICAgY29uc3QgX2FkZE1vZGVsID0gKG06IE0sIHJlc2V0OiBib29sZWFuKSA9PlxuICAgICAgdGhpcy5fYWRkTW9kZWwobSwgeyBzaWxlbnQsIHBvc2l0aW9uLCBtZXJnZSwgcmVwYXJlbnQsIHJlc2V0IH0pO1xuICAgIHJldHVybiBzZXJ2ZXJcbiAgICAgID8gdGhpcy5fcmVxdWVzdCh0aGlzLl9hZGRTZXJ2ZXIobW9kZWwpLCAobW9kZWwpID0+XG4gICAgICAgICAgX2FkZE1vZGVsKG1vZGVsLCByZXNldCA/PyB0cnVlKSxcbiAgICAgICAgKVxuICAgICAgOiBvZihfYWRkTW9kZWwobW9kZWwsIHJlc2V0ID8/IGZhbHNlKSk7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVTZXJ2ZXIobW9kZWw6IE0sIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnMpOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSkge1xuICAgICAgaWYgKCFtb2RlbC5pc05ldygpKSB7XG4gICAgICAgIC8vIFJlbW92ZSBSZWZlcmVuY2VcbiAgICAgICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgICAgICB0aGlzLl9tb2RlbC5tZXRhLmFwaS5vcHRpb25zLmRlbGV0ZVJlZkJ5ID09PSAnaWQnXG4gICAgICAgICAgICA/IChtb2RlbC5hc0VudGl0eSgoZSkgPT4gZS5yZXNvdXJjZSgpKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+KVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLl9tb2RlbC5tZXRhLmFwaS5vcHRpb25zLmRlbGV0ZVJlZkJ5ID09PSAncGF0aCcpIHtcbiAgICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlLmtleShtb2RlbC5rZXkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc291cmNlXG4gICAgICAgICAgLnJlZmVyZW5jZSgpXG4gICAgICAgICAgLnJlbW92ZSh0YXJnZXQsIG9wdGlvbnMpXG4gICAgICAgICAgLnBpcGUobWFwKCgpID0+IG1vZGVsKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZW1vdmUgQ29udGFpbmVkXG4gICAgICAgIHJldHVybiByZXNvdXJjZS5kZXN0cm95KG9wdGlvbnMpLnBpcGUobWFwKCgpID0+IG1vZGVsKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UpIHtcbiAgICAgIHJldHVybiBtb2RlbC5hc0VudGl0eSgoZSkgPT4gZS5kZXN0cm95KG9wdGlvbnMpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9mKG1vZGVsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyByZXNldD86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBNIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeShtb2RlbCk7XG4gICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQgfHwgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKSB7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfVxuXG4gICAgLy8gTm93IHJlbW92ZVxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZW50cmllcy5pbmRleE9mKGVudHJ5KTtcbiAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKCEocmVzZXQgfHwgZW50cnkuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCkpIHtcbiAgICAgIC8vIE1vdmUgdG8gZW5kIG9mIGFycmF5IGFuZCBtYXJrIGFzIHJlbW92ZWRcbiAgICAgIGVudHJ5LnN0YXRlID0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQ7XG4gICAgICB0aGlzLl9lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIH1cblxuICAgIC8vIFRyaWdnZXIgRXZlbnRcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgbW9kZWwuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuUmVtb3ZlLCB7XG4gICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgIG9wdGlvbnM6IHsgaW5kZXg6IGluZGV4IH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl91bmxpbmsoZW50cnkpO1xuICAgIHJldHVybiBlbnRyeS5tb2RlbDtcbiAgfVxuXG4gIHJlbW92ZShcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgICByZXNldCxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHNlcnZlcj86IGJvb2xlYW47IHJlc2V0PzogYm9vbGVhbiB9ID0ge30sXG4gICk6IE9ic2VydmFibGU8TT4ge1xuICAgIGNvbnN0IF9yZW1vdmVNb2RlbCA9IChtOiBNLCByZXNldDogYm9vbGVhbikgPT5cbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKG0sIHsgc2lsZW50LCByZXNldCB9KTtcbiAgICByZXR1cm4gc2VydmVyXG4gICAgICA/IHRoaXMuX3JlcXVlc3QodGhpcy5fcmVtb3ZlU2VydmVyKG1vZGVsKSwgKG1vZGVsKSA9PlxuICAgICAgICAgIF9yZW1vdmVNb2RlbChtb2RlbCwgcmVzZXQgPz8gdHJ1ZSksXG4gICAgICAgIClcbiAgICAgIDogb2YoX3JlbW92ZU1vZGVsKG1vZGVsLCByZXNldCA/PyBmYWxzZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbW92ZU1vZGVsKG1vZGVsOiBNLCBwb3NpdGlvbjogbnVtYmVyKTogTSB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLl9maW5kRW50cnkobW9kZWwpO1xuICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkIHx8IGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH1cblxuICAgIC8vIE5vdyByZW1vdmVcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX2VudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgdGhpcy5fZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuX2VudHJpZXMuc3BsaWNlKHBvc2l0aW9uLCAwLCBlbnRyeSk7XG5cbiAgICByZXR1cm4gZW50cnkubW9kZWw7XG4gIH1cblxuICBjcmVhdGUoXG4gICAgYXR0cnM6IFQgPSB7fSBhcyBULFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgc2VydmVyID0gdHJ1ZSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHNlcnZlcj86IGJvb2xlYW4gfSA9IHt9LFxuICApIHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxGYWN0b3J5KGF0dHJzKTtcbiAgICByZXR1cm4gKG1vZGVsLmlzVmFsaWQoKSAmJiBzZXJ2ZXIgPyBtb2RlbC5zYXZlKCkgOiBvZihtb2RlbCkpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKG1vZGVsKSA9PiB0aGlzLmFkZChtb2RlbCwgeyBzaWxlbnQsIHNlcnZlciB9KSksXG4gICAgICBtYXAoKCkgPT4gbW9kZWwpLFxuICAgICk7XG4gIH1cblxuICBzZXQocGF0aDogc3RyaW5nIHwgc3RyaW5nW10sIHZhbHVlOiBhbnksIHt9OiB7fSAmIE1vZGVsRmllbGRPcHRpb25zKSB7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiAocGF0aCBhcyBzdHJpbmcpLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMuX2VudHJpZXNbTnVtYmVyKHBhdGhBcnJheVswXSldLm1vZGVsO1xuICAgICAgcmV0dXJuIG1vZGVsLnNldChwYXRoQXJyYXkuc2xpY2UoMSksIHZhbHVlLCB7fSk7XG4gICAgfVxuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAxICYmIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICBjb25zdCBtb2RlbHMgPSB0aGlzLm1vZGVscygpO1xuICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIocGF0aEFycmF5WzBdKTtcbiAgICAgIG1vZGVsc1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgIHRoaXMuYXNzaWduKG1vZGVscywgeyByZXBhcmVudDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBnZXQocGF0aDogbnVtYmVyKTogTSB8IHVuZGVmaW5lZDtcbiAgZ2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKTogYW55O1xuICBnZXQocGF0aDogYW55KTogYW55IHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IGAke3BhdGh9YC5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tb2RlbHMoKVtOdW1iZXIocGF0aEFycmF5WzBdKV07XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPiAxICYmIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuZ2V0KHBhdGhBcnJheS5zbGljZSgxKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGhhcyhwYXRoOiBudW1iZXIgfCBzdHJpbmcgfCBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogYCR7cGF0aH1gLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubW9kZWxzKClbTnVtYmVyKHBhdGhBcnJheVswXSldO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLmhhcyhwYXRoQXJyYXkuc2xpY2UoMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJlc2V0KHtcbiAgICBwYXRoLFxuICAgIHNpbGVudCA9IGZhbHNlLFxuICB9OiB7IHBhdGg/OiBzdHJpbmcgfCBzdHJpbmdbXTsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBsZXQgdG9BZGQ6IE9EYXRhTW9kZWxFbnRyeTxULCBNPltdID0gW107XG4gICAgbGV0IHRvQ2hhbmdlOiBPRGF0YU1vZGVsRW50cnk8VCwgTT5bXSA9IFtdO1xuICAgIGxldCB0b1JlbW92ZTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+W10gPSBbXTtcblxuICAgIGlmIChwYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFJlc2V0IGJ5IHBhdGhcbiAgICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiBgJHtwYXRofWAubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgICApIGFzIGFueVtdO1xuICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIocGF0aEFycmF5WzBdKTtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKGluZGV4KSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxzKClbaW5kZXhdO1xuICAgICAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChtb2RlbCkpIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeShtb2RlbCkgYXMgT0RhdGFNb2RlbEVudHJ5PFQsIE0+O1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkICYmXG4gICAgICAgICAgICBlbnRyeS5tb2RlbC5oYXNDaGFuZ2VkKClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRvQ2hhbmdlID0gW2VudHJ5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF0aCA9IHBhdGhBcnJheS5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCBhbGxcbiAgICAgIHRvQWRkID0gdGhpcy5fZW50cmllcy5maWx0ZXIoKGUpID0+IGUuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKTtcbiAgICAgIHRvQ2hhbmdlID0gdGhpcy5fZW50cmllcy5maWx0ZXIoXG4gICAgICAgIChlKSA9PiBlLnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkICYmIGUubW9kZWwuaGFzQ2hhbmdlZCgpLFxuICAgICAgKTtcbiAgICAgIHRvUmVtb3ZlID0gdGhpcy5fZW50cmllcy5maWx0ZXIoKGUpID0+IGUuc3RhdGUgPT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCk7XG4gICAgfVxuXG4gICAgdG9SZW1vdmUuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKGVudHJ5Lm1vZGVsLCB7IHNpbGVudCB9KTtcbiAgICB9KTtcbiAgICB0b0FkZC5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgdGhpcy5fYWRkTW9kZWwoZW50cnkubW9kZWwsIHsgc2lsZW50IH0pO1xuICAgIH0pO1xuICAgIHRvQ2hhbmdlLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICBlbnRyeS5tb2RlbC5yZXNldCh7IHBhdGgsIHNpbGVudCB9KTtcbiAgICAgIGVudHJ5LnN0YXRlID0gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZDtcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICAhc2lsZW50ICYmXG4gICAgICAodG9BZGQubGVuZ3RoID4gMCB8fCB0b1JlbW92ZS5sZW5ndGggPiAwIHx8IHRvQ2hhbmdlLmxlbmd0aCA+IDApXG4gICAgKSB7XG4gICAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLlJlc2V0LCB7XG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBhZGRlZDogdG9BZGQubWFwKChlKSA9PiBlLm1vZGVsKSxcbiAgICAgICAgICByZW1vdmVkOiB0b1JlbW92ZS5tYXAoKGUpID0+IGUubW9kZWwpLFxuICAgICAgICAgIGNoYW5nZWQ6IHRvQ2hhbmdlLm1hcCgoZSkgPT4gZS5tb2RlbCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjbGVhcih7IHNpbGVudCA9IGZhbHNlIH06IHsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBjb25zdCB0b1JlbW92ZTogTVtdID0gdGhpcy5tb2RlbHMoKTtcbiAgICB0b1JlbW92ZS5mb3JFYWNoKChtKSA9PiB7XG4gICAgICB0aGlzLl9yZW1vdmVNb2RlbChtLCB7IHNpbGVudCB9KTtcbiAgICB9KTtcbiAgICB0aGlzLl9lbnRyaWVzID0gW107XG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuVXBkYXRlLCB7XG4gICAgICAgIG9wdGlvbnM6IHsgcmVtb3ZlZDogdG9SZW1vdmUgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzc2lnbihcbiAgICBvYmplY3RzOiBQYXJ0aWFsPFQ+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdIHwgTVtdLFxuICAgIHtcbiAgICAgIGFkZCA9IHRydWUsXG4gICAgICBtZXJnZSA9IHRydWUsXG4gICAgICByZW1vdmUgPSB0cnVlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBhZGQ/OiBib29sZWFuO1xuICAgICAgbWVyZ2U/OiBib29sZWFuO1xuICAgICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICAgIHJlcGFyZW50PzogYm9vbGVhbjtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICBjb25zdCBvZmZzZXQgPSByZW1vdmUgPyAwIDogdGhpcy5sZW5ndGg7XG5cbiAgICBjb25zdCBtb2RlbHM6IE1bXSA9IFtdO1xuICAgIGNvbnN0IHRvQWRkOiBNW10gPSBbXTtcbiAgICBjb25zdCB0b01lcmdlOiBNW10gPSBbXTtcbiAgICBjb25zdCB0b1JlbW92ZTogTVtdID0gW107XG4gICAgb2JqZWN0cy5mb3JFYWNoKChvYmosIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwob2JqKVxuICAgICAgICA/IChvYmogYXMgTSlcbiAgICAgICAgOiAodGhpcy5tb2RlbEZhY3Rvcnkob2JqIGFzIFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSwge1xuICAgICAgICAgICAgcmVzZXQsXG4gICAgICAgICAgfSkgYXMgTSk7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGluZGV4ICsgb2Zmc2V0O1xuICAgICAgLy8gVHJ5IGZpbmQgZW50cnlcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fZmluZEVudHJ5KG1vZGVsKTtcblxuICAgICAgaWYgKG1lcmdlICYmIGVudHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGVudHJ5Lm1vZGVsICE9PSBtb2RlbCkge1xuICAgICAgICAgIGVudHJ5Lm1vZGVsLmFzc2lnbihcbiAgICAgICAgICAgIG1vZGVsLnRvRW50aXR5KHtcbiAgICAgICAgICAgICAgY2xpZW50X2lkOiB0cnVlLFxuICAgICAgICAgICAgICAuLi5JTkNMVURFX0RFRVAsXG4gICAgICAgICAgICB9KSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICAgICAgICAgIHsgYWRkLCBtZXJnZSwgcmVtb3ZlLCByZXNldCwgc2lsZW50IH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBNb2RlbCBDaGFuZ2U/XG4gICAgICAgICAgaWYgKGVudHJ5Lm1vZGVsLmhhc0NoYW5nZWQoKSkgdG9NZXJnZS5wdXNoKGVudHJ5Lm1vZGVsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzZXQpIGVudHJ5LnN0YXRlID0gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZDtcbiAgICAgICAgaWYgKCFtb2RlbHMuaW5jbHVkZXMoZW50cnkubW9kZWwpKSB7XG4gICAgICAgICAgbW9kZWxzLnB1c2goZW50cnkubW9kZWwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFkZCkge1xuICAgICAgICAvLyBBZGRcbiAgICAgICAgdG9BZGQucHVzaChtb2RlbCk7XG4gICAgICAgIHRoaXMuX2FkZE1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcmVzZXQsIHJlcGFyZW50LCBwb3NpdGlvbiB9KTtcbiAgICAgICAgbW9kZWxzLnB1c2gobW9kZWwpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHJlbW92ZSkge1xuICAgICAgWy4uLnRoaXMuX2VudHJpZXNdLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gZW50cnkubW9kZWw7XG4gICAgICAgIGlmICghbW9kZWxzLmluY2x1ZGVzKG1vZGVsKSkge1xuICAgICAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcmVzZXQgfSk7XG4gICAgICAgICAgdG9SZW1vdmUucHVzaChtb2RlbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMubW9kZWxzKClcbiAgICAgICAgLnNsaWNlKG9mZnNldClcbiAgICAgICAgLnNvbWUoKG0sIGkpID0+IG0gIT09IG1vZGVsc1tpXSlcbiAgICApIHtcbiAgICAgIG1vZGVscy5mb3JFYWNoKChtLCBpKSA9PiB0aGlzLl9tb3ZlTW9kZWwobSwgaSkpO1xuICAgICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5Tb3J0KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhc2lsZW50ICYmXG4gICAgICAodG9BZGQubGVuZ3RoID4gMCB8fCB0b1JlbW92ZS5sZW5ndGggPiAwIHx8IHRvTWVyZ2UubGVuZ3RoID4gMClcbiAgICApIHtcbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKFxuICAgICAgICByZXNldCA/IE9EYXRhTW9kZWxFdmVudFR5cGUuUmVzZXQgOiBPRGF0YU1vZGVsRXZlbnRUeXBlLlVwZGF0ZSxcbiAgICAgICAge1xuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGFkZGVkOiB0b0FkZCxcbiAgICAgICAgICAgIHJlbW92ZWQ6IHRvUmVtb3ZlLFxuICAgICAgICAgICAgbWVyZ2VkOiB0b01lcmdlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbW9kZWxzO1xuICB9XG5cbiAgcXVlcnkoXG4gICAgY3R4OiAocTogT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyPFQ+LCBzPzogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPikgPT4gdm9pZCxcbiAgKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlKSB7XG4gICAgICByZXNvdXJjZS5xdWVyeShjdHgpO1xuICAgICAgdGhpcy5hdHRhY2gocmVzb3VyY2UpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGNhbGxGdW5jdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6ICdwcm9wZXJ0eScgfCAnbW9kZWwnIHwgJ2NvbGxlY3Rpb24nIHwgJ25vbmUnLFxuICAgIG9wdGlvbnM6IE9EYXRhRnVuY3Rpb25PcHRpb25zPFI+ID0ge30sXG4gICk6IE9ic2VydmFibGU8UiB8IE9EYXRhTW9kZWw8Uj4gfCBPRGF0YUNvbGxlY3Rpb248UiwgT0RhdGFNb2RlbDxSPj4gfCBudWxsPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiY2FsbEZ1bmN0aW9uOiBDYW4ndCBjYWxsIGZ1bmN0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZVwiLFxuICAgICAgICAgICksXG4gICAgICApO1xuXG4gICAgY29uc3QgZnVuYyA9IHJlc291cmNlLmZ1bmN0aW9uPFAsIFI+KG5hbWUpLnF1ZXJ5KChxKSA9PiBxLnJlc3RvcmUob3B0aW9ucykpO1xuICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7XG4gICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGZ1bmMuY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KGZ1bmMuY2FsbE1vZGVsKHBhcmFtcywgb3B0aW9ucyksIChyZXNwKSA9PiByZXNwKTtcbiAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBmdW5jLmNhbGxDb2xsZWN0aW9uKHBhcmFtcywgb3B0aW9ucyksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBmdW5jLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjYWxsQWN0aW9uPFAsIFI+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHJlc3BvbnNlVHlwZTogJ3Byb3BlcnR5JyB8ICdtb2RlbCcgfCAnY29sbGVjdGlvbicgfCAnbm9uZScsXG4gICAgb3B0aW9uczogT0RhdGFBY3Rpb25PcHRpb25zPFI+ID0ge30sXG4gICk6IE9ic2VydmFibGU8UiB8IE9EYXRhTW9kZWw8Uj4gfCBPRGF0YUNvbGxlY3Rpb248UiwgT0RhdGFNb2RlbDxSPj4gfCBudWxsPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlKSkge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYGNhbGxBY3Rpb246IENhbid0IGNhbGwgYWN0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZWAsXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGFjdGlvbiA9IHJlc291cmNlLmFjdGlvbjxQLCBSPihuYW1lKS5xdWVyeSgocSkgPT4gcS5yZXN0b3JlKG9wdGlvbnMpKTtcbiAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBhY3Rpb24uY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KGFjdGlvbi5jYWxsTW9kZWwocGFyYW1zLCBvcHRpb25zKSwgKHJlc3ApID0+IHJlc3ApO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGFjdGlvbi5jYWxsQ29sbGVjdGlvbihwYXJhbXMsIG9wdGlvbnMpLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgYWN0aW9uLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF91bmxpbmsoZW50cnk6IE9EYXRhTW9kZWxFbnRyeTxULCBNPikge1xuICAgIGlmIChlbnRyeS5zdWJzY3JpcHRpb24pIHtcbiAgICAgIGVudHJ5LnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgZW50cnkuc3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xpbmsoZW50cnk6IE9EYXRhTW9kZWxFbnRyeTxULCBNPikge1xuICAgIGlmIChlbnRyeS5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbjogU3Vic2NyaXB0aW9uIGFscmVhZHkgZXhpc3RzJyk7XG4gICAgfVxuICAgIGVudHJ5LnN1YnNjcmlwdGlvbiA9IGVudHJ5Lm1vZGVsLmV2ZW50cyQuc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50OiBPRGF0YU1vZGVsRXZlbnQ8VD4pID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmNhbkNvbnRpbnVlV2l0aCh0aGlzKSkge1xuICAgICAgICAgIGlmIChldmVudC5tb2RlbCA9PT0gZW50cnkubW9kZWwpIHtcbiAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSBPRGF0YU1vZGVsRXZlbnRUeXBlLkRlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlTW9kZWwoZW50cnkubW9kZWwsIHsgcmVzZXQ6IHRydWUgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBldmVudC50eXBlID09PSBPRGF0YU1vZGVsRXZlbnRUeXBlLkNoYW5nZSAmJlxuICAgICAgICAgICAgICBldmVudC5vcHRpb25zPy5rZXlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBlbnRyeS5rZXkgPSBlbnRyeS5tb2RlbC5rZXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbmRleCA9XG4gICAgICAgICAgICBldmVudC5vcHRpb25zPy5pbmRleCA/PyB0aGlzLm1vZGVscygpLmluZGV4T2YoZW50cnkubW9kZWwpO1xuICAgICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KGV2ZW50LnB1c2godGhpcywgaW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZEVudHJ5KG1vZGVsOiBPRGF0YU1vZGVsPFQ+KSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXMuZmluZChcbiAgICAgIChlbnRyeSkgPT5cbiAgICAgICAgKGVudHJ5LmtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgbW9kZWwua2V5KCkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIFR5cGVzLmlzRXF1YWwoZW50cnkua2V5LCBtb2RlbC5rZXkoKSkpIHx8XG4gICAgICAgIGVudHJ5Lm1vZGVsLmVxdWFscyhtb2RlbCksXG4gICAgKTtcbiAgfVxuXG4gIC8vIENvbGxlY3Rpb24gZnVuY3Rpb25zXG4gIGVxdWFscyhvdGhlcjogT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMgPT09IG90aGVyO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnQ29sbGVjdGlvbic7XG4gIH1cblxuICBwdWJsaWMgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgbGV0IHBvaW50ZXIgPSAwO1xuICAgIGNvbnN0IG1vZGVscyA9IHRoaXMubW9kZWxzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQoKTogSXRlcmF0b3JSZXN1bHQ8TT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRvbmU6IHBvaW50ZXIgPT09IG1vZGVscy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWU6IG1vZGVsc1twb2ludGVyKytdLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9IGFzIEl0ZXJhdG9yPE0+O1xuICB9XG5cbiAgZmlsdGVyKFxuICAgIHByZWRpY2F0ZTogKHZhbHVlOiBNLCBpbmRleDogbnVtYmVyLCBhcnJheTogTVtdKSA9PiB1bmtub3duLFxuICAgIHRoaXNBcmc/OiBhbnksXG4gICk6IE1bXSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuZmlsdGVyKHByZWRpY2F0ZSwgdGhpc0FyZyk7XG4gIH1cblxuICBtYXA8VT4oXG4gICAgY2FsbGJhY2tmbjogKHZhbHVlOiBNLCBpbmRleDogbnVtYmVyLCBhcnJheTogTVtdKSA9PiBVLFxuICAgIHRoaXNBcmc/OiBhbnksXG4gICk6IFVbXSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkubWFwKGNhbGxiYWNrZm4sIHRoaXNBcmcpO1xuICB9XG5cbiAgZmluZChcbiAgICBwcmVkaWNhdGU6ICh2YWx1ZTogTSwgaW5kZXg6IG51bWJlciwgb2JqOiBNW10pID0+IHVua25vd24sXG4gICk6IE0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuXG4gIHJlZHVjZTxVPihcbiAgICBjYWxsYmFja2ZuOiAoXG4gICAgICBwcmV2aW91c1ZhbHVlOiBVLFxuICAgICAgY3VycmVudFZhbHVlOiBNLFxuICAgICAgY3VycmVudEluZGV4OiBudW1iZXIsXG4gICAgICBhcnJheTogTVtdLFxuICAgICkgPT4gVSxcbiAgICBpbml0aWFsVmFsdWU6IFUsXG4gICk6IFUge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLnJlZHVjZShjYWxsYmFja2ZuLCBpbml0aWFsVmFsdWUpO1xuICB9XG5cbiAgZmlyc3QoKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKClbMF07XG4gIH1cblxuICBsYXN0KCk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1vZGVscyA9IHRoaXMubW9kZWxzKCk7XG4gICAgcmV0dXJuIG1vZGVsc1ttb2RlbHMubGVuZ3RoIC0gMV07XG4gIH1cblxuICBuZXh0KG1vZGVsOiBNKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4T2YobW9kZWwpO1xuICAgIGlmIChpbmRleCA9PT0gLTEgfHwgaW5kZXggPT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGluZGV4ICsgMSk7XG4gIH1cblxuICBwcmV2KG1vZGVsOiBNKTogTSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4T2YobW9kZWwpO1xuICAgIGlmIChpbmRleCA8PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXQoaW5kZXggLSAxKTtcbiAgfVxuXG4gIGV2ZXJ5KHByZWRpY2F0ZTogKG06IE0sIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5ldmVyeShwcmVkaWNhdGUpO1xuICB9XG5cbiAgc29tZShwcmVkaWNhdGU6IChtOiBNLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuc29tZShwcmVkaWNhdGUpO1xuICB9XG5cbiAgaW5jbHVkZXMobW9kZWw6IE0sIHN0YXJ0OiBudW1iZXIgPSAwKSB7XG4gICAgcmV0dXJuIHRoaXMuc29tZSgobSwgaSkgPT4gaSA+PSBzdGFydCAmJiBtLmVxdWFscyhtb2RlbCkpO1xuICB9XG5cbiAgaW5kZXhPZihtb2RlbDogTSk6IG51bWJlciB7XG4gICAgY29uc3QgbW9kZWxzID0gdGhpcy5tb2RlbHMoKTtcbiAgICBjb25zdCBtID0gbW9kZWxzLmZpbmQoKG0pID0+IG0uZXF1YWxzKG1vZGVsKSk7XG4gICAgcmV0dXJuICFtID8gLTEgOiBtb2RlbHMuaW5kZXhPZihtKTtcbiAgfVxuXG4gIGZvckVhY2goXG4gICAgcHJlZGljYXRlOiAodmFsdWU6IE0sIGluZGV4OiBudW1iZXIsIGFycmF5OiBNW10pID0+IHZvaWQsXG4gICAgdGhpc0FyZz86IGFueSxcbiAgKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkuZm9yRWFjaChwcmVkaWNhdGUsIHRoaXNBcmcpO1xuICB9XG5cbiAgaXNFbXB0eSgpIHtcbiAgICAvLyBMb2NhbCBsZW5ndGggPT0gMCBhbmQgaWYgZXhpc3QgcmVtb3RlIGNvdW50IGlzIDAgb3IgdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwICYmICF0aGlzLmFubm90cygpLmNvdW50O1xuICB9XG5cbiAgLy8jcmVnaW9uIFNvcnRcbiAgcHJpdmF0ZSBfY29tcGFyZShcbiAgICBlMTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+IHwgTSxcbiAgICBlMjogT0RhdGFNb2RlbEVudHJ5PFQsIE0+IHwgTSxcbiAgICBieTogeyBmaWVsZDogc3RyaW5nIHwga2V5b2YgVDsgb3JkZXI/OiAxIHwgLTEgfVtdLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgbTEgPSBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGUxKVxuICAgICAgPyAoZTEgYXMgTSlcbiAgICAgIDogKGUxIGFzIE9EYXRhTW9kZWxFbnRyeTxULCBNPikubW9kZWw7XG4gICAgY29uc3QgbTIgPSBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGUyKVxuICAgICAgPyAoZTIgYXMgTSlcbiAgICAgIDogKGUyIGFzIE9EYXRhTW9kZWxFbnRyeTxULCBNPikubW9kZWw7XG4gICAgY29uc3QgdmFsdWUxID0gbTEuZ2V0KGJ5W2luZGV4XS5maWVsZCBhcyBzdHJpbmcpO1xuICAgIGNvbnN0IHZhbHVlMiA9IG0yLmdldChieVtpbmRleF0uZmllbGQgYXMgc3RyaW5nKTtcbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgPSAwO1xuXG4gICAgaWYgKHZhbHVlMSA9PSBudWxsICYmIHZhbHVlMiAhPSBudWxsKSByZXN1bHQgPSAtMTtcbiAgICBlbHNlIGlmICh2YWx1ZTEgIT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbCkgcmVzdWx0ID0gMTtcbiAgICBlbHNlIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbCkgcmVzdWx0ID0gMDtcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUxID09ICdzdHJpbmcnIHx8IHZhbHVlMSBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgaWYgKHZhbHVlMS5sb2NhbGVDb21wYXJlICYmIHZhbHVlMSAhPSB2YWx1ZTIpIHtcbiAgICAgICAgcmV0dXJuIChieVtpbmRleF0ub3JkZXIgfHwgMSkgKiB2YWx1ZTEubG9jYWxlQ29tcGFyZSh2YWx1ZTIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB2YWx1ZTEgPCB2YWx1ZTIgPyAtMSA6IDE7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlMSA9PSB2YWx1ZTIpIHtcbiAgICAgIHJldHVybiBieS5sZW5ndGggLSAxID4gaW5kZXggPyB0aGlzLl9jb21wYXJlKGUxLCBlMiwgYnksIGluZGV4ICsgMSkgOiAwO1xuICAgIH1cblxuICAgIHJldHVybiAoYnlbaW5kZXhdLm9yZGVyIHx8IDEpICogcmVzdWx0O1xuICB9XG5cbiAgX3NvcnRCeTogeyBmaWVsZDogc3RyaW5nIHwga2V5b2YgVDsgb3JkZXI/OiAxIHwgLTEgfVtdIHwgbnVsbCA9IG51bGw7XG4gIGlzU29ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zb3J0QnkgIT09IG51bGw7XG4gIH1cblxuICBzb3J0KFxuICAgIGJ5OiB7IGZpZWxkOiBzdHJpbmcgfCBrZXlvZiBUOyBvcmRlcj86IDEgfCAtMSB9W10sXG4gICAgeyBzaWxlbnQgfTogeyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fSxcbiAgKSB7XG4gICAgdGhpcy5fc29ydEJ5ID0gYnk7XG4gICAgdGhpcy5fZW50cmllcyA9IHRoaXMuX2VudHJpZXMuc29ydChcbiAgICAgIChlMTogT0RhdGFNb2RlbEVudHJ5PFQsIE0+LCBlMjogT0RhdGFNb2RlbEVudHJ5PFQsIE0+KSA9PlxuICAgICAgICB0aGlzLl9jb21wYXJlKGUxLCBlMiwgYnksIDApLFxuICAgICk7XG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuU29ydCk7XG4gICAgfVxuICB9XG4gIC8vI2VuZHJlZ2lvblxufVxuIl19
|