angular-odata 0.127.0 → 0.128.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/annotations.mjs +140 -0
- package/esm2022/lib/api.mjs +209 -164
- package/esm2022/lib/cache/cache.mjs +1 -1
- package/esm2022/lib/cache/memory.mjs +1 -1
- package/esm2022/lib/client.mjs +4 -44
- package/esm2022/lib/constants.mjs +4 -1
- package/esm2022/lib/index.mjs +3 -1
- package/esm2022/lib/loaders.mjs +23 -17
- package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +95 -0
- package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +27 -0
- package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +24 -0
- package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +37 -0
- package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +94 -0
- package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +7 -0
- package/esm2022/lib/metadata/csdl/csdl-reference.mjs +23 -0
- package/esm2022/lib/metadata/csdl/csdl-schema.mjs +39 -0
- package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +15 -0
- package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +70 -0
- package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +92 -0
- package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +15 -0
- package/esm2022/lib/metadata/index.mjs +3 -0
- package/esm2022/lib/metadata/metadata.mjs +14 -0
- package/esm2022/lib/metadata/parser.mjs +563 -0
- package/esm2022/lib/models/collection.mjs +98 -140
- package/esm2022/lib/models/model.mjs +38 -45
- package/esm2022/lib/models/options.mjs +127 -117
- package/esm2022/lib/module.mjs +3 -3
- package/esm2022/lib/resources/index.mjs +2 -2
- package/esm2022/lib/resources/options.mjs +56 -0
- package/esm2022/lib/resources/path/handlers.mjs +14 -4
- package/esm2022/lib/resources/path/segments.mjs +6 -4
- package/esm2022/lib/resources/query/builder.mjs +5 -5
- package/esm2022/lib/resources/query/expressions/apply.mjs +81 -14
- package/esm2022/lib/resources/query/expressions/base.mjs +1 -1
- package/esm2022/lib/resources/query/expressions/compute.mjs +1 -1
- package/esm2022/lib/resources/query/expressions/count.mjs +1 -1
- package/esm2022/lib/resources/query/expressions/expand.mjs +1 -1
- package/esm2022/lib/resources/query/expressions/filter.mjs +1 -1
- package/esm2022/lib/resources/query/expressions/orderby.mjs +2 -2
- package/esm2022/lib/resources/query/expressions/search.mjs +1 -1
- package/esm2022/lib/resources/query/expressions/select.mjs +5 -1
- package/esm2022/lib/resources/query/expressions/syntax.mjs +18 -7
- package/esm2022/lib/resources/query/handlers.mjs +1 -1
- package/esm2022/lib/resources/query/options.mjs +1 -1
- package/esm2022/lib/resources/request.mjs +5 -5
- package/esm2022/lib/resources/resource.mjs +107 -82
- package/esm2022/lib/resources/response.mjs +174 -0
- package/esm2022/lib/resources/types/action.mjs +29 -26
- package/esm2022/lib/resources/types/batch.mjs +1 -1
- package/esm2022/lib/resources/types/count.mjs +7 -7
- package/esm2022/lib/resources/types/entity-set.mjs +37 -24
- package/esm2022/lib/resources/types/entity.mjs +14 -11
- package/esm2022/lib/resources/types/function.mjs +25 -28
- package/esm2022/lib/resources/types/metadata.mjs +9 -5
- package/esm2022/lib/resources/types/navigation-property.mjs +36 -30
- package/esm2022/lib/resources/types/property.mjs +31 -49
- package/esm2022/lib/resources/types/reference.mjs +3 -4
- package/esm2022/lib/resources/types/singleton.mjs +11 -7
- package/esm2022/lib/resources/types/value.mjs +16 -12
- package/esm2022/lib/schema/callable.mjs +10 -10
- package/esm2022/lib/schema/element.mjs +15 -9
- package/esm2022/lib/schema/entity-container.mjs +4 -2
- package/esm2022/lib/schema/enum-type.mjs +6 -7
- package/esm2022/lib/schema/index.mjs +2 -1
- package/esm2022/lib/schema/parsers/callable.mjs +10 -7
- package/esm2022/lib/schema/parsers/edm.mjs +6 -4
- package/esm2022/lib/schema/parsers/enum-type.mjs +10 -10
- package/esm2022/lib/schema/parsers/structured-type.mjs +19 -19
- package/esm2022/lib/schema/schema.mjs +18 -34
- package/esm2022/lib/schema/singleton.mjs +9 -0
- package/esm2022/lib/schema/structured-type.mjs +18 -23
- package/esm2022/lib/services/base.mjs +1 -1
- package/esm2022/lib/services/entity-set.mjs +12 -2
- package/esm2022/lib/services/entity.mjs +2 -2
- package/esm2022/lib/services/factory.mjs +18 -7
- package/esm2022/lib/services/singleton.mjs +8 -2
- package/esm2022/lib/settings.mjs +7 -99
- package/esm2022/lib/types.mjs +1 -1
- package/esm2022/lib/utils/http.mjs +1 -1
- package/fesm2022/angular-odata.mjs +2286 -1951
- package/fesm2022/angular-odata.mjs.map +1 -1
- package/lib/{resources/responses/annotations.d.ts → annotations.d.ts} +2 -2
- package/lib/api.d.ts +29 -26
- package/lib/cache/memory.d.ts +1 -1
- package/lib/client.d.ts +0 -20
- package/lib/constants.d.ts +3 -0
- package/lib/index.d.ts +1 -0
- package/lib/loaders.d.ts +7 -1
- package/lib/metadata/csdl/csdl-annotation.d.ts +123 -0
- package/lib/metadata/csdl/csdl-entity-container.d.ts +26 -0
- package/lib/metadata/csdl/csdl-entity-set.d.ts +20 -0
- package/lib/metadata/csdl/csdl-enum-type.d.ts +29 -0
- package/lib/metadata/csdl/csdl-function-action.d.ts +105 -0
- package/lib/metadata/csdl/csdl-navigation-property-binding.d.ts +8 -0
- package/lib/metadata/csdl/csdl-reference.d.ts +30 -0
- package/lib/metadata/csdl/csdl-schema.d.ts +34 -0
- package/lib/metadata/csdl/csdl-singleton.d.ts +16 -0
- package/lib/metadata/csdl/csdl-structural-property.d.ts +70 -0
- package/lib/metadata/csdl/csdl-structured-type.d.ts +73 -0
- package/lib/metadata/csdl/csdl-type-definition.d.ts +22 -0
- package/lib/metadata/index.d.ts +2 -0
- package/lib/metadata/metadata.d.ts +10 -0
- package/lib/{resources/responses/metadata.d.ts → metadata/parser.d.ts} +19 -7
- package/lib/models/collection.d.ts +4 -3
- package/lib/models/model.d.ts +15 -23
- package/lib/models/options.d.ts +37 -23
- package/lib/resources/index.d.ts +1 -1
- package/lib/resources/{responses/options.d.ts → options.d.ts} +2 -2
- package/lib/resources/path/handlers.d.ts +4 -2
- package/lib/resources/path/segments.d.ts +3 -1
- package/lib/resources/query/expressions/apply.d.ts +37 -15
- package/lib/resources/query/expressions/base.d.ts +1 -1
- package/lib/resources/query/expressions/compute.d.ts +2 -2
- package/lib/resources/query/expressions/count.d.ts +1 -1
- package/lib/resources/query/expressions/expand.d.ts +1 -1
- package/lib/resources/query/expressions/filter.d.ts +1 -1
- package/lib/resources/query/expressions/orderby.d.ts +5 -4
- package/lib/resources/query/expressions/search.d.ts +1 -1
- package/lib/resources/query/expressions/select.d.ts +2 -1
- package/lib/resources/query/expressions/syntax.d.ts +6 -3
- package/lib/resources/resource.d.ts +27 -15
- package/lib/resources/{responses/response.d.ts → response.d.ts} +17 -5
- package/lib/resources/types/action.d.ts +12 -10
- package/lib/resources/types/batch.d.ts +3 -2
- package/lib/resources/types/count.d.ts +1 -5
- package/lib/resources/types/entity-set.d.ts +13 -6
- package/lib/resources/types/entity.d.ts +3 -4
- package/lib/resources/types/function.d.ts +11 -11
- package/lib/resources/types/metadata.d.ts +1 -1
- package/lib/resources/types/navigation-property.d.ts +13 -7
- package/lib/resources/types/property.d.ts +15 -8
- package/lib/resources/types/reference.d.ts +2 -4
- package/lib/resources/types/singleton.d.ts +4 -6
- package/lib/resources/types/value.d.ts +2 -6
- package/lib/schema/callable.d.ts +5 -7
- package/lib/schema/element.d.ts +11 -4
- package/lib/schema/entity-container.d.ts +2 -0
- package/lib/schema/enum-type.d.ts +4 -7
- package/lib/schema/index.d.ts +1 -0
- package/lib/schema/parsers/callable.d.ts +7 -8
- package/lib/schema/parsers/enum-type.d.ts +2 -4
- package/lib/schema/parsers/structured-type.d.ts +6 -8
- package/lib/schema/schema.d.ts +6 -9
- package/lib/schema/singleton.d.ts +10 -0
- package/lib/schema/structured-type.d.ts +5 -8
- package/lib/services/entity-set.d.ts +7 -3
- package/lib/services/factory.d.ts +14 -2
- package/lib/services/singleton.d.ts +4 -2
- package/lib/settings.d.ts +0 -10
- package/lib/types.d.ts +12 -3
- package/package.json +5 -1
- package/schematics/apigen/angular/api-config.d.ts +15 -0
- package/schematics/apigen/angular/api-config.js +34 -0
- package/schematics/apigen/angular/api-config.js.map +1 -0
- package/schematics/apigen/angular/base.d.ts +51 -0
- package/schematics/apigen/angular/base.js +200 -0
- package/schematics/apigen/angular/base.js.map +1 -0
- package/schematics/apigen/angular/entity.d.ts +24 -0
- package/schematics/apigen/angular/entity.js +71 -0
- package/schematics/apigen/angular/entity.js.map +1 -0
- package/schematics/apigen/angular/enum.d.ts +25 -0
- package/schematics/apigen/angular/enum.js +56 -0
- package/schematics/apigen/angular/enum.js.map +1 -0
- package/schematics/apigen/angular/import.d.ts +6 -0
- package/schematics/apigen/angular/import.js +18 -0
- package/schematics/apigen/angular/import.js.map +1 -0
- package/schematics/apigen/angular/module.d.ts +18 -0
- package/schematics/apigen/angular/module.js +41 -0
- package/schematics/apigen/angular/module.js.map +1 -0
- package/schematics/apigen/angular/service.d.ts +20 -0
- package/schematics/apigen/angular/service.js +76 -0
- package/schematics/apigen/angular/service.js.map +1 -0
- package/schematics/apigen/files/api-config/__fileName__.ts +9 -0
- package/schematics/apigen/files/entity/__fileName__.ts +7 -0
- package/schematics/apigen/files/entitycontainer-service/__fileName__.ts +18 -0
- package/schematics/apigen/files/entityset-service/__fileName__.ts +27 -0
- package/schematics/apigen/files/enum/__fileName__.ts +4 -0
- package/schematics/apigen/files/index/__fileName__.ts +2 -0
- package/schematics/apigen/files/module/__fileName__.ts +9 -0
- package/schematics/apigen/files/singleton-service/__fileName__.ts +18 -0
- package/schematics/apigen/index.d.ts +3 -0
- package/schematics/apigen/index.js +106 -0
- package/schematics/apigen/index.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-annotation.d.ts +120 -0
- package/schematics/apigen/metadata/csdl/csdl-annotation.js +98 -0
- package/schematics/apigen/metadata/csdl/csdl-annotation.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-container.d.ts +26 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-container.js +30 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-container.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-set.d.ts +20 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-set.js +26 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-set.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-enum-type.d.ts +28 -0
- package/schematics/apigen/metadata/csdl/csdl-enum-type.js +33 -0
- package/schematics/apigen/metadata/csdl/csdl-enum-type.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-function-action.d.ts +103 -0
- package/schematics/apigen/metadata/csdl/csdl-function-action.js +84 -0
- package/schematics/apigen/metadata/csdl/csdl-function-action.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.d.ts +8 -0
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js +11 -0
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-reference.d.ts +30 -0
- package/schematics/apigen/metadata/csdl/csdl-reference.js +29 -0
- package/schematics/apigen/metadata/csdl/csdl-reference.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-schema.d.ts +32 -0
- package/schematics/apigen/metadata/csdl/csdl-schema.js +26 -0
- package/schematics/apigen/metadata/csdl/csdl-schema.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-singleton.d.ts +18 -0
- package/schematics/apigen/metadata/csdl/csdl-singleton.js +25 -0
- package/schematics/apigen/metadata/csdl/csdl-singleton.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-structural-property.d.ts +63 -0
- package/schematics/apigen/metadata/csdl/csdl-structural-property.js +50 -0
- package/schematics/apigen/metadata/csdl/csdl-structural-property.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-structured-type.d.ts +64 -0
- package/schematics/apigen/metadata/csdl/csdl-structured-type.js +71 -0
- package/schematics/apigen/metadata/csdl/csdl-structured-type.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-type-definition.d.ts +22 -0
- package/schematics/apigen/metadata/csdl/csdl-type-definition.js +19 -0
- package/schematics/apigen/metadata/csdl/csdl-type-definition.js.map +1 -0
- package/schematics/apigen/metadata/index.d.ts +1 -0
- package/schematics/apigen/metadata/index.js +18 -0
- package/schematics/apigen/metadata/index.js.map +1 -0
- package/schematics/apigen/metadata/metadata.d.ts +11 -0
- package/schematics/apigen/metadata/metadata.js +30 -0
- package/schematics/apigen/metadata/metadata.js.map +1 -0
- package/schematics/apigen/metadata/parser.d.ts +110 -0
- package/schematics/apigen/metadata/parser.js +568 -0
- package/schematics/apigen/metadata/parser.js.map +1 -0
- package/schematics/apigen/schema.d.ts +8 -0
- package/schematics/apigen/schema.js +3 -0
- package/schematics/apigen/schema.js.map +1 -0
- package/schematics/apigen/schema.json +36 -0
- package/schematics/apigen/utils.d.ts +1 -0
- package/schematics/apigen/utils.js +75 -0
- package/schematics/apigen/utils.js.map +1 -0
- package/schematics/collection.json +14 -0
- package/schematics/ng-add/index.d.ts +2 -0
- package/schematics/ng-add/index.js +13 -0
- package/schematics/ng-add/index.js.map +1 -0
- package/schematics/random.d.ts +1 -0
- package/schematics/random.js +604 -0
- package/schematics/random.js.map +1 -0
- package/esm2022/lib/resources/responses/annotations.mjs +0 -140
- package/esm2022/lib/resources/responses/csdl/csdl-annotation.mjs +0 -33
- package/esm2022/lib/resources/responses/csdl/csdl-entity-container.mjs +0 -11
- package/esm2022/lib/resources/responses/csdl/csdl-entity-set.mjs +0 -9
- package/esm2022/lib/resources/responses/csdl/csdl-enum-type.mjs +0 -15
- package/esm2022/lib/resources/responses/csdl/csdl-function-action.mjs +0 -56
- package/esm2022/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs +0 -7
- package/esm2022/lib/resources/responses/csdl/csdl-reference.mjs +0 -23
- package/esm2022/lib/resources/responses/csdl/csdl-schema.mjs +0 -18
- package/esm2022/lib/resources/responses/csdl/csdl-singleton.mjs +0 -8
- package/esm2022/lib/resources/responses/csdl/csdl-structural-property.mjs +0 -39
- package/esm2022/lib/resources/responses/csdl/csdl-structured-type.mjs +0 -34
- package/esm2022/lib/resources/responses/csdl/csdl-type-definition.mjs +0 -14
- package/esm2022/lib/resources/responses/index.mjs +0 -5
- package/esm2022/lib/resources/responses/metadata.mjs +0 -547
- package/esm2022/lib/resources/responses/options.mjs +0 -56
- package/esm2022/lib/resources/responses/response.mjs +0 -174
- package/esm2022/lib/resources/responses/types.mjs +0 -2
- package/lib/resources/responses/csdl/csdl-annotation.d.ts +0 -27
- package/lib/resources/responses/csdl/csdl-entity-container.d.ts +0 -12
- package/lib/resources/responses/csdl/csdl-entity-set.d.ts +0 -8
- package/lib/resources/responses/csdl/csdl-enum-type.d.ts +0 -12
- package/lib/resources/responses/csdl/csdl-function-action.d.ts +0 -49
- package/lib/resources/responses/csdl/csdl-navigation-property-binding.d.ts +0 -5
- package/lib/resources/responses/csdl/csdl-reference.d.ts +0 -18
- package/lib/resources/responses/csdl/csdl-schema.d.ts +0 -20
- package/lib/resources/responses/csdl/csdl-singleton.d.ts +0 -7
- package/lib/resources/responses/csdl/csdl-structural-property.d.ts +0 -31
- package/lib/resources/responses/csdl/csdl-structured-type.d.ts +0 -27
- package/lib/resources/responses/csdl/csdl-type-definition.d.ts +0 -11
- package/lib/resources/responses/index.d.ts +0 -4
- package/lib/resources/responses/types.d.ts +0 -13
|
@@ -3,12 +3,11 @@ import { finalize, map } from 'rxjs/operators';
|
|
|
3
3
|
import { ODataEntityResource, ODataNavigationPropertyResource, } from '../resources';
|
|
4
4
|
import { Objects, Strings, Types } from '../utils';
|
|
5
5
|
import { ODataCollection } from './collection';
|
|
6
|
-
import { INCLUDE_DEEP,
|
|
7
|
-
// @dynamic
|
|
6
|
+
import { INCLUDE_DEEP, ODataModelOptions, ODataModelEventType, ODataModelEventEmitter, } from './options';
|
|
8
7
|
export class ODataModel {
|
|
9
|
-
static
|
|
10
|
-
if (
|
|
11
|
-
|
|
8
|
+
static buildMetaOptions({ config, structuredType, }) {
|
|
9
|
+
if (config === undefined) {
|
|
10
|
+
const fields = structuredType
|
|
12
11
|
.fields({ include_navigation: true, include_parents: true })
|
|
13
12
|
.reduce((acc, field) => {
|
|
14
13
|
let name = field.name;
|
|
@@ -24,11 +23,11 @@ export class ODataModel {
|
|
|
24
23
|
},
|
|
25
24
|
});
|
|
26
25
|
}, {});
|
|
27
|
-
|
|
26
|
+
config = {
|
|
28
27
|
fields: new Map(Object.entries(fields)),
|
|
29
28
|
};
|
|
30
29
|
}
|
|
31
|
-
|
|
30
|
+
return new ODataModelOptions({ config, structuredType });
|
|
32
31
|
}
|
|
33
32
|
constructor(data = {}, { parent, resource, annots, reset = false, } = {}) {
|
|
34
33
|
// Parent
|
|
@@ -36,14 +35,6 @@ export class ODataModel {
|
|
|
36
35
|
this._resource = null;
|
|
37
36
|
this._resources = [];
|
|
38
37
|
this._attributes = new Map();
|
|
39
|
-
this._assign = {
|
|
40
|
-
add: false,
|
|
41
|
-
merge: false,
|
|
42
|
-
remove: false,
|
|
43
|
-
reset: false,
|
|
44
|
-
reparent: false,
|
|
45
|
-
silent: false
|
|
46
|
-
};
|
|
47
38
|
const Klass = this.constructor;
|
|
48
39
|
if (Klass.meta === undefined)
|
|
49
40
|
throw new Error(`Model: Can't create model without metadata`);
|
|
@@ -53,7 +44,9 @@ export class ODataModel {
|
|
|
53
44
|
// Client Id
|
|
54
45
|
this[this._meta.cid] =
|
|
55
46
|
data[this._meta.cid] ||
|
|
56
|
-
Strings.uniqueId({
|
|
47
|
+
Strings.uniqueId({
|
|
48
|
+
prefix: `${Klass.meta.structuredType.name.toLowerCase()}-`,
|
|
49
|
+
});
|
|
57
50
|
if (!reset)
|
|
58
51
|
data = Objects.merge(this.defaults(), data);
|
|
59
52
|
this.assign(data, { reset });
|
|
@@ -103,7 +96,7 @@ export class ODataModel {
|
|
|
103
96
|
}
|
|
104
97
|
//#endregion
|
|
105
98
|
schema() {
|
|
106
|
-
return this._meta.
|
|
99
|
+
return this._meta.structuredType;
|
|
107
100
|
}
|
|
108
101
|
annots() {
|
|
109
102
|
return this._annotations;
|
|
@@ -160,7 +153,7 @@ export class ODataModel {
|
|
|
160
153
|
});
|
|
161
154
|
}
|
|
162
155
|
toJson() {
|
|
163
|
-
return this.toEntity();
|
|
156
|
+
return this.toEntity(INCLUDE_DEEP);
|
|
164
157
|
}
|
|
165
158
|
set(path, value, { type } = {}) {
|
|
166
159
|
const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
|
|
@@ -219,11 +212,17 @@ export class ODataModel {
|
|
|
219
212
|
}
|
|
220
213
|
}
|
|
221
214
|
assign(entity, { add = true, merge = true, remove = true, reset = false, reparent = false, silent = false, } = {}) {
|
|
222
|
-
return this._meta.assign(this, entity, {
|
|
215
|
+
return this._meta.assign(this, entity, {
|
|
216
|
+
add,
|
|
217
|
+
merge,
|
|
218
|
+
remove,
|
|
219
|
+
reset,
|
|
220
|
+
silent,
|
|
221
|
+
reparent,
|
|
222
|
+
});
|
|
223
223
|
}
|
|
224
224
|
clone() {
|
|
225
|
-
|
|
226
|
-
return new Ctor(this.toEntity(INCLUDE_SHALLOW), {
|
|
225
|
+
return new this.constructor(this.toEntity(INCLUDE_DEEP), {
|
|
227
226
|
resource: this.resource(),
|
|
228
227
|
annots: this.annots(),
|
|
229
228
|
});
|
|
@@ -235,7 +234,7 @@ export class ODataModel {
|
|
|
235
234
|
return obs$.pipe(map((response) => mapCallback(response)), finalize(() => this.events$.trigger(ODataModelEventType.Sync)));
|
|
236
235
|
}
|
|
237
236
|
fetch({ ...options } = {}) {
|
|
238
|
-
|
|
237
|
+
const resource = this.resource();
|
|
239
238
|
if (!resource)
|
|
240
239
|
return throwError(() => new Error('fetch: Resource is null'));
|
|
241
240
|
let obs$;
|
|
@@ -253,12 +252,11 @@ export class ODataModel {
|
|
|
253
252
|
}
|
|
254
253
|
return this._request(obs$, ({ entity, annots }) => {
|
|
255
254
|
this._annotations = annots;
|
|
256
|
-
this.assign(
|
|
257
|
-
return this;
|
|
255
|
+
return this.assign(entity ?? {}, { reset: true });
|
|
258
256
|
});
|
|
259
257
|
}
|
|
260
258
|
save({ method, navigation = false, validate = true, ...options } = {}) {
|
|
261
|
-
|
|
259
|
+
const resource = this.resource();
|
|
262
260
|
if (!resource)
|
|
263
261
|
return throwError(() => new Error('save: Resource is null'));
|
|
264
262
|
if (!(resource instanceof ODataEntityResource ||
|
|
@@ -284,7 +282,7 @@ export class ODataModel {
|
|
|
284
282
|
include_concurrency: true,
|
|
285
283
|
include_navigation: navigation,
|
|
286
284
|
});
|
|
287
|
-
|
|
285
|
+
const obs$ = method === 'create'
|
|
288
286
|
? resource.create(_entity, options)
|
|
289
287
|
: method === 'modify'
|
|
290
288
|
? resource.modify(_entity, {
|
|
@@ -297,12 +295,13 @@ export class ODataModel {
|
|
|
297
295
|
});
|
|
298
296
|
return this._request(obs$, ({ entity, annots }) => {
|
|
299
297
|
this._annotations = annots;
|
|
300
|
-
this.assign(
|
|
301
|
-
|
|
298
|
+
return this.assign(entity ?? _entity, {
|
|
299
|
+
reset: true,
|
|
300
|
+
});
|
|
302
301
|
});
|
|
303
302
|
}
|
|
304
303
|
destroy({ ...options } = {}) {
|
|
305
|
-
|
|
304
|
+
const resource = this.resource();
|
|
306
305
|
if (!resource)
|
|
307
306
|
return throwError(() => new Error('destroy: Resource is null'));
|
|
308
307
|
if (!(resource instanceof ODataEntityResource ||
|
|
@@ -310,7 +309,6 @@ export class ODataModel {
|
|
|
310
309
|
return throwError(() => new Error('destroy: Resource type ODataEntityResource/ODataNavigationPropertyResource needed'));
|
|
311
310
|
if (!resource.hasKey())
|
|
312
311
|
return throwError(() => new Error("destroy: Can't destroy model without key"));
|
|
313
|
-
const _entity = this.toEntity({ field_mapping: true });
|
|
314
312
|
const obs$ = resource.destroy({ etag: this.annots().etag, ...options });
|
|
315
313
|
return this._request(obs$, (resp) => {
|
|
316
314
|
this.events$.trigger(ODataModelEventType.Destroy);
|
|
@@ -334,10 +332,10 @@ export class ODataModel {
|
|
|
334
332
|
return this._meta.hasChanged(this, { include_navigation });
|
|
335
333
|
}
|
|
336
334
|
encode(name, options) {
|
|
337
|
-
|
|
335
|
+
const value = this[name];
|
|
338
336
|
if (value === undefined)
|
|
339
337
|
return undefined;
|
|
340
|
-
|
|
338
|
+
const field = this._meta.findField(name);
|
|
341
339
|
return field ? field.encode(value, options) : value;
|
|
342
340
|
}
|
|
343
341
|
isNew() {
|
|
@@ -397,7 +395,7 @@ export class ODataModel {
|
|
|
397
395
|
}
|
|
398
396
|
//#endregion
|
|
399
397
|
// Cast
|
|
400
|
-
cast(type) {
|
|
398
|
+
cast(type, ModelType) {
|
|
401
399
|
//: ODataModel<S> {
|
|
402
400
|
const resource = this.resource();
|
|
403
401
|
if (!(resource instanceof ODataEntityResource))
|
|
@@ -406,6 +404,7 @@ export class ODataModel {
|
|
|
406
404
|
.cast(type)
|
|
407
405
|
.asModel(this.toEntity(INCLUDE_DEEP), {
|
|
408
406
|
annots: this.annots(),
|
|
407
|
+
ModelType,
|
|
409
408
|
});
|
|
410
409
|
}
|
|
411
410
|
fetchNavigationProperty(name, responseType, options = {}) {
|
|
@@ -423,7 +422,7 @@ export class ODataModel {
|
|
|
423
422
|
if (!field)
|
|
424
423
|
throw Error(`fetchAttribute: Can't find attribute ${name}`);
|
|
425
424
|
if (field.isStructuredType() && field.collection) {
|
|
426
|
-
|
|
425
|
+
const collection = field.collectionFactory({ parent: this });
|
|
427
426
|
collection.query((q) => q.restore(options));
|
|
428
427
|
return this._request(collection.fetch(options), () => {
|
|
429
428
|
this.assign({ [name]: collection });
|
|
@@ -431,7 +430,7 @@ export class ODataModel {
|
|
|
431
430
|
});
|
|
432
431
|
}
|
|
433
432
|
else if (field.isStructuredType()) {
|
|
434
|
-
|
|
433
|
+
const model = field.modelFactory({ parent: this });
|
|
435
434
|
model.query((q) => q.restore(options));
|
|
436
435
|
return this._request(model.fetch(options), () => {
|
|
437
436
|
this.assign({ [name]: model });
|
|
@@ -484,10 +483,7 @@ export class ODataModel {
|
|
|
484
483
|
else if (model === null) {
|
|
485
484
|
obs$ = reference.unset({ etag, ...options });
|
|
486
485
|
}
|
|
487
|
-
return this._request(obs$, (model) => {
|
|
488
|
-
this.assign({ [name]: model });
|
|
489
|
-
return this;
|
|
490
|
-
});
|
|
486
|
+
return this._request(obs$, (model) => this.assign({ [name]: model }));
|
|
491
487
|
}
|
|
492
488
|
setReference(name, model, options) {
|
|
493
489
|
const reference = this.navigationProperty(name).reference();
|
|
@@ -504,10 +500,7 @@ export class ODataModel {
|
|
|
504
500
|
else if (model === null) {
|
|
505
501
|
obs$ = reference.unset({ etag, ...options });
|
|
506
502
|
}
|
|
507
|
-
return this._request(obs$, (model) => {
|
|
508
|
-
this.assign({ [name]: model });
|
|
509
|
-
return this;
|
|
510
|
-
});
|
|
503
|
+
return this._request(obs$, (model) => this.assign({ [name]: model }));
|
|
511
504
|
}
|
|
512
505
|
//#region Model Identity
|
|
513
506
|
get [Symbol.toStringTag]() {
|
|
@@ -556,5 +549,5 @@ export class ODataModel {
|
|
|
556
549
|
return this.collection()?.prev(this);
|
|
557
550
|
}
|
|
558
551
|
}
|
|
559
|
-
|
|
560
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvbW9kZWxzL21vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFrQixVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQU8sTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBS0wsbUJBQW1CLEVBRW5CLCtCQUErQixHQVFoQyxNQUFNLGNBQWMsQ0FBQztBQUV0QixPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsWUFBWSxFQUNaLGVBQWUsRUFHZixpQkFBaUIsRUFFakIsbUJBQW1CLEVBRW5CLHNCQUFzQixHQUN2QixNQUFNLFdBQVcsQ0FBQztBQUduQixXQUFXO0FBQ1gsTUFBTSxPQUFPLFVBQVU7SUFJckIsTUFBTSxDQUFDLFNBQVMsQ0FBSSxFQUNsQixPQUFPLEVBQ1AsTUFBTSxHQUlQO1FBQ0MsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3pCLElBQUksTUFBTSxHQUFHLE1BQU07aUJBQ2hCLE1BQU0sQ0FBQyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQzNELE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDckIsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDdEIsMkNBQTJDO2dCQUMzQyxPQUFPLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDMUMsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFH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QU8sSUFBSSxDQUFDO1NBQ2Y7YUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1NBQ3JEO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsWUFBWTtJQUVaLDBCQUEwQjtJQUMxQixVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUk7WUFDMUIsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUF1QztZQUN4RCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FFRjtBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FDNUQsVUFBVSxDQUFDLFNBQVMsQ0FDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcmtKb2luLCBORVZFUiwgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbmFsaXplLCBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEVudGl0eUtleSxcbiAgT0RhdGFBY3Rpb25PcHRpb25zLFxuICBPRGF0YUVudGl0eSxcbiAgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFGdW5jdGlvbk9wdGlvbnMsXG4gIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhT3B0aW9ucyxcbiAgT0RhdGFQcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YVF1ZXJ5QXJndW1lbnRzLFxuICBPRGF0YVF1ZXJ5QXJndW1lbnRzT3B0aW9ucyxcbiAgT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyLFxuICBPRGF0YVJlc291cmNlLFxuICBPRGF0YVNpbmdsZXRvblJlc291cmNlLFxufSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgT0RhdGFTdHJ1Y3R1cmVkVHlwZSB9IGZyb20gJy4uL3NjaGVtYSc7XG5pbXBvcnQgeyBPYmplY3RzLCBTdHJpbmdzLCBUeXBlcyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IE9EYXRhQ29sbGVjdGlvbiB9IGZyb20gJy4vY29sbGVjdGlvbic7XG5pbXBvcnQge1xuICBJTkNMVURFX0RFRVAsXG4gIElOQ0xVREVfU0hBTExPVyxcbiAgTW9kZWxPcHRpb25zLFxuICBPRGF0YU1vZGVsRmllbGQsXG4gIE9EYXRhTW9kZWxPcHRpb25zLFxuICBPRGF0YU1vZGVsQXR0cmlidXRlLFxuICBPRGF0YU1vZGVsRXZlbnRUeXBlLFxuICBNb2RlbEZpZWxkT3B0aW9ucyxcbiAgT0RhdGFNb2RlbEV2ZW50RW1pdHRlcixcbn0gZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IFBhcnNlck9wdGlvbnMgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8vIEBkeW5hbWljXG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbDxUPiB7XG4gIC8vIFByb3BlcnRpZXNcbiAgc3RhdGljIG9wdGlvbnM6IE1vZGVsT3B0aW9ucztcbiAgc3RhdGljIG1ldGE6IE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gIHN0YXRpYyBidWlsZE1ldGE8VD4oe1xuICAgIG9wdGlvbnMsXG4gICAgc2NoZW1hLFxuICB9OiB7XG4gICAgb3B0aW9ucz86IE1vZGVsT3B0aW9ucztcbiAgICBzY2hlbWE6IE9EYXRhU3RydWN0dXJlZFR5cGU8VD47XG4gIH0pIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgZmllbGRzID0gc2NoZW1hXG4gICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsIGluY2x1ZGVfcGFyZW50czogdHJ1ZSB9KVxuICAgICAgICAucmVkdWNlKChhY2MsIGZpZWxkKSA9PiB7XG4gICAgICAgICAgbGV0IG5hbWUgPSBmaWVsZC5uYW1lO1xuICAgICAgICAgIC8vIFByZXZlbnQgY29sbGlzaW9uIHdpdGggcmVzZXJ2ZWQga2V5d29yZHNcbiAgICAgICAgICB3aGlsZSAoUkVTRVJWRURfRklFTERfTkFNRVMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgJ18nO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHtcbiAgICAgICAgICAgIFtuYW1lXToge1xuICAgICAgICAgICAgICBmaWVsZDogZmllbGQubmFtZSxcbiAgICAgICAgICAgICAgZGVmYXVsdDogZmllbGQuZGVmYXVsdCxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6ICFmaWVsZC5udWxsYWJsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIGZpZWxkczogbmV3IE1hcDxzdHJpbmcsIE1vZGVsRmllbGRPcHRpb25zPihPYmplY3QuZW50cmllcyhmaWVsZHMpKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMubWV0YSA9IG5ldyBPRGF0YU1vZGVsT3B0aW9uczxUPih7IG9wdGlvbnMsIHNjaGVtYSB9KTtcbiAgfVxuICAvLyBQYXJlbnRcbiAgX3BhcmVudDpcbiAgICB8IFtcbiAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICBdXG4gICAgfCBudWxsID0gbnVsbDtcbiAgX3Jlc291cmNlOiBPRGF0YVJlc291cmNlPFQ+IHwgbnVsbCA9IG51bGw7XG4gIF9yZXNvdXJjZXM6IHtcbiAgICBwYXJlbnQ6XG4gICAgfCBbXG4gICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgXVxuICAgIHwgbnVsbDtcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxUPiB8IG51bGw7XG4gIH1bXSA9IFtdO1xuICBfYXR0cmlidXRlczogTWFwPHN0cmluZywgT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+PiA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIE9EYXRhTW9kZWxBdHRyaWJ1dGU8YW55PlxuICA+KCk7XG4gIF9hbm5vdGF0aW9ucyE6IE9EYXRhRW50aXR5QW5ub3RhdGlvbnM8VD47XG4gIF9tZXRhOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICBfYXNzaWduOiB7XG4gICAgYWRkOiBib29sZWFuXG4gICAgbWVyZ2U6IGJvb2xlYW5cbiAgICByZW1vdmU6IGJvb2xlYW5cbiAgICByZXNldDogYm9vbGVhblxuICAgIHJlcGFyZW50OiBib29sZWFuXG4gICAgc2lsZW50OiBib29sZWFuXG4gIH0gPSB7XG4gICAgYWRkOiBmYWxzZSxcbiAgICBtZXJnZTogZmFsc2UsXG4gICAgcmVtb3ZlOiBmYWxzZSxcbiAgICByZXNldDogZmFsc2UsXG4gICAgcmVwYXJlbnQ6IGZhbHNlLFxuICAgIHNpbGVudDogZmFsc2VcbiAgfVxuICAvLyBFdmVudHNcbiAgZXZlbnRzJDogT0RhdGFNb2RlbEV2ZW50RW1pdHRlcjxUPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkYXRhOiBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0gPSB7fSxcbiAgICB7XG4gICAgICBwYXJlbnQsXG4gICAgICByZXNvdXJjZSxcbiAgICAgIGFubm90cyxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgcGFyZW50PzogW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgIF07XG4gICAgICByZXNvdXJjZT86IE9EYXRhUmVzb3VyY2U8VD4gfCBudWxsO1xuICAgICAgYW5ub3RzPzogT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxUPjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgY29uc3QgS2xhc3MgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPRGF0YU1vZGVsO1xuICAgIGlmIChLbGFzcy5tZXRhID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsOiBDYW4ndCBjcmVhdGUgbW9kZWwgd2l0aG91dCBtZXRhZGF0YWApO1xuICAgIHRoaXMuX21ldGEgPSBLbGFzcy5tZXRhO1xuICAgIHRoaXMuZXZlbnRzJCA9IG5ldyBPRGF0YU1vZGVsRXZlbnRFbWl0dGVyPFQ+KHsgbW9kZWw6IHRoaXMgfSk7XG4gICAgdGhpcy5fbWV0YS5iaW5kKHRoaXMsIHsgcGFyZW50LCByZXNvdXJjZSwgYW5ub3RzIH0pO1xuXG4gICAgLy8gQ2xpZW50IElkXG4gICAgKDxhbnk+dGhpcylbdGhpcy5fbWV0YS5jaWRdID1cbiAgICAgICg8YW55PmRhdGEpW3RoaXMuX21ldGEuY2lkXSB8fFxuICAgICAgU3RyaW5ncy51bmlxdWVJZCh7IHByZWZpeDogYCR7S2xhc3MubWV0YS5zY2hlbWEubmFtZS50b0xvd2VyQ2FzZSgpfS1gIH0pO1xuXG4gICAgaWYgKCFyZXNldClcbiAgICAgIGRhdGEgPSBPYmplY3RzLm1lcmdlKHRoaXMuZGVmYXVsdHMoKSwgZGF0YSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSkgYXMgUGFydGlhbDxUPjtcblxuICAgIHRoaXMuYXNzaWduKGRhdGEsIHsgcmVzZXQgfSk7XG4gIH1cblxuICAvLyNyZWdpb24gUmVzb3VyY2VzXG4gIHJlc291cmNlKCk6XG4gICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgICB8IG51bGwge1xuICAgIHJldHVybiBPRGF0YU1vZGVsT3B0aW9ucy5yZXNvdXJjZTxUPih0aGlzKSBhc1xuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgICAgIHwgbnVsbDtcbiAgfVxuXG4gIHB1c2hSZXNvdXJjZShcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gICAgICB8IG51bGxcbiAgKSB7XG4gICAgLy8gUHVzaCBjdXJyZW50IHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICB0aGlzLl9yZXNvdXJjZXMucHVzaCh7IHBhcmVudDogdGhpcy5fcGFyZW50LCByZXNvdXJjZTogdGhpcy5fcmVzb3VyY2UgfSk7XG4gICAgLy8gUmVwbGFjZSBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG5cbiAgcG9wUmVzb3VyY2UoKSB7XG4gICAgLy8gUG9wIHBhcmVudCBhbmQgcmVzb3VyY2VcbiAgICBjb25zdCBwb3AgPSB0aGlzLl9yZXNvdXJjZXMucG9wKCk7XG4gICAgaWYgKHBvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0geyBwYXJlbnQ6IHRoaXMuX3BhcmVudCwgcmVzb3VyY2U6IHRoaXMuX3Jlc291cmNlIH07XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwb3AucGFyZW50O1xuICAgICAgdGhpcy5fcmVzb3VyY2UgPSBwb3AucmVzb3VyY2U7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5hdmlnYXRpb25Qcm9wZXJ0eTxOPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nXG4gICk6IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Tj4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fbWV0YS5maW5kRmllbGQ8Tj4obmFtZSk7XG4gICAgaWYgKCFmaWVsZCB8fCAhZmllbGQubmF2aWdhdGlvbilcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgbmF2aWdhdGlvblByb3BlcnR5OiBDYW4ndCBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHkgJHtuYW1lIGFzIHN0cmluZ31gXG4gICAgICApO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB8fCAhcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJuYXZpZ2F0aW9uUHJvcGVydHk6IENhbid0IGdldCBuYXZpZ2F0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGZpZWxkLnJlc291cmNlRmFjdG9yeTxULCBOPihcbiAgICAgIHJlc291cmNlXG4gICAgKSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPE4+O1xuICB9XG5cbiAgcHJvcGVydHk8Tj4obmFtZTogc3RyaW5nKTogT0RhdGFQcm9wZXJ0eVJlc291cmNlPE4+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmluZEZpZWxkPE4+KG5hbWUpO1xuICAgIGlmICghZmllbGQgfHwgZmllbGQubmF2aWdhdGlvbilcbiAgICAgIHRocm93IEVycm9yKGBwcm9wZXJ0eTogQ2FuJ3QgZmluZCBwcm9wZXJ0eSAke25hbWV9YCk7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBcInByb3BlcnR5OiBDYW4ndCBnZXQgcHJvcGVydHkgd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlIHdpdGgga2V5XCJcbiAgICAgICk7XG5cbiAgICByZXR1cm4gZmllbGQucmVzb3VyY2VGYWN0b3J5PFQsIE4+KHJlc291cmNlKSBhcyBPRGF0YVByb3BlcnR5UmVzb3VyY2U8Tj47XG4gIH1cblxuICBhdHRhY2goXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPlxuICApIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5hdHRhY2godGhpcywgcmVzb3VyY2UpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIHNjaGVtYSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5zY2hlbWE7XG4gIH1cblxuICBhbm5vdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICB9XG5cbiAga2V5KHtcbiAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgcmVzb2x2ZSA9IHRydWUsXG4gIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuIH0gPSB7fSk6XG4gICAgfCBFbnRpdHlLZXk8VD5cbiAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnJlc29sdmVLZXkodGhpcywgeyBmaWVsZF9tYXBwaW5nLCByZXNvbHZlIH0pO1xuICB9XG5cbiAgaXNPcGVuTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuaXNPcGVuVHlwZSgpO1xuICB9XG5cbiAgaXNQYXJlbnRPZihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PlxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hpbGQgIT09IHRoaXMgJiZcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmNoYWluKGNoaWxkKS5zb21lKChwKSA9PiBwWzBdID09PSB0aGlzKVxuICAgICk7XG4gIH1cblxuICByZWZlcmVudGlhbChcbiAgICBhdHRyOiBPRGF0YU1vZGVsQXR0cmlidXRlPGFueT4gfCBPRGF0YU1vZGVsRmllbGQ8YW55PixcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5yZXNvbHZlUmVmZXJlbnRpYWwodGhpcywgYXR0ciwge1xuICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgIHJlc29sdmUsXG4gICAgfSk7XG4gIH1cblxuICByZWZlcmVuY2VkKFxuICAgIGF0dHI6IE9EYXRhTW9kZWxBdHRyaWJ1dGU8YW55PiB8IE9EYXRhTW9kZWxGaWVsZDxhbnk+LFxuICAgIHtcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIHJlc29sdmUgPSB0cnVlLFxuICAgIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnJlc29sdmVSZWZlcmVuY2VkKHRoaXMsIGF0dHIsIHtcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICByZXNvbHZlLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gVmFsaWRhdGlvblxuICBfZXJyb3JzPzogeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIHZhbGlkYXRlKHtcbiAgICBtZXRob2QsXG4gICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICB9OiB7XG4gICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS52YWxpZGF0ZSh0aGlzLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KTtcbiAgfVxuXG4gIGlzVmFsaWQoe1xuICAgIG1ldGhvZCxcbiAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHtcbiAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gIH0gPSB7fSk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2Vycm9ycyA9IHRoaXMudmFsaWRhdGUoeyBtZXRob2QsIG5hdmlnYXRpb24gfSk7XG4gICAgaWYgKHRoaXMuX2Vycm9ycyAhPT0gdW5kZWZpbmVkKVxuICAgICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5JbnZhbGlkLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLl9lcnJvcnMsXG4gICAgICAgIG9wdGlvbnM6IHsgbWV0aG9kIH0sXG4gICAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JzID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICBkZWZhdWx0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5kZWZhdWx0cygpIHx8IHt9O1xuICB9XG5cbiAgdG9FbnRpdHkoe1xuICAgIGNsaWVudF9pZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9rZXkgPSB0cnVlLFxuICAgIGluY2x1ZGVfaWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX25vbl9maWVsZCA9IGZhbHNlLFxuICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICBjaGFpbiA9IFtdLFxuICB9OiB7XG4gICAgY2xpZW50X2lkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfa2V5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2lkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgY2hhbmdlc19vbmx5PzogYm9vbGVhbjtcbiAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgICBjaGFpbj86IChPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVtdO1xuICB9ID0ge30pOiBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnRvRW50aXR5KHRoaXMsIHtcbiAgICAgIGNsaWVudF9pZCxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgaW5jbHVkZV9rZXksXG4gICAgICBpbmNsdWRlX2lkLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICBjaGFuZ2VzX29ubHksXG4gICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgY2hhaW4sXG4gICAgfSk7XG4gIH1cblxuICB0b0pzb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9FbnRpdHkoKTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSwgdmFsdWU6IGFueSwgeyB0eXBlIH06IHsgdHlwZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gKDxhbnk+dGhpcylbcGF0aEFycmF5WzBdXTtcbiAgICAgIHJldHVybiBtb2RlbC5zZXQocGF0aEFycmF5LnNsaWNlKDEpLCB2YWx1ZSwge30pO1xuICAgIH1cbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21ldGEuc2V0KHRoaXMsIHBhdGhBcnJheVswXSwgdmFsdWUsIHsgdHlwZSB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQocGF0aDogc3RyaW5nIHwgc3RyaW5nW10pOiBhbnkge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fbWV0YS5nZXQ8YW55Pih0aGlzLCBwYXRoQXJyYXlbMF0pO1xuICAgIGlmIChcbiAgICAgIHBhdGhBcnJheS5sZW5ndGggPiAxICYmXG4gICAgICAodmFsdWUgaW5zdGFuY2VvZiBPRGF0YU1vZGVsIHx8IHZhbHVlIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKVxuICAgICkge1xuICAgICAgcmV0dXJuIHZhbHVlLmdldChwYXRoQXJyYXkuc2xpY2UoMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBoYXMocGF0aDogc3RyaW5nIHwgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fbWV0YS5nZXQ8YW55Pih0aGlzLCBwYXRoQXJyYXlbMF0pO1xuICAgIGlmIChcbiAgICAgIHBhdGhBcnJheS5sZW5ndGggPiAxICYmXG4gICAgICAodmFsdWUgaW5zdGFuY2VvZiBPRGF0YU1vZGVsIHx8IHZhbHVlIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKVxuICAgICkge1xuICAgICAgcmV0dXJuIHZhbHVlLmhhcyhwYXRoQXJyYXkuc2xpY2UoMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJlc2V0KHtcbiAgICBwYXRoLFxuICAgIHNpbGVudCA9IGZhbHNlLFxuICB9OiB7IHBhdGg/OiBzdHJpbmcgfCBzdHJpbmdbXTsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBjb25zdCBwYXRoQXJyYXk6IHN0cmluZ1tdID0gKFxuICAgICAgcGF0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gW11cbiAgICAgICAgOiBUeXBlcy5pc0FycmF5KHBhdGgpXG4gICAgICAgICAgPyBwYXRoXG4gICAgICAgICAgOiAocGF0aCBhcyBzdHJpbmcpLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgY29uc3QgbmFtZSA9IHBhdGhBcnJheVswXTtcbiAgICBjb25zdCB2YWx1ZSA9IG5hbWUgIT09IHVuZGVmaW5lZCA/ICg8YW55PnRoaXMpW25hbWVdIDogdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpIHx8XG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpXG4gICAgKSB7XG4gICAgICB2YWx1ZS5yZXNldCh7IHBhdGg6IHBhdGhBcnJheS5zbGljZSgxKSwgc2lsZW50IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tZXRhLnJlc2V0KHRoaXMsIHsgbmFtZTogcGF0aEFycmF5WzBdLCBzaWxlbnQgfSk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoeyBzaWxlbnQgPSBmYWxzZSB9OiB7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgdGhpcy5fYXR0cmlidXRlcy5jbGVhcigpO1xuICAgIGlmICghc2lsZW50KSB7XG4gICAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLlVwZGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgYXNzaWduKFxuICAgIGVudGl0eTogUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHtcbiAgICAgIGFkZCA9IHRydWUsXG4gICAgICBtZXJnZSA9IHRydWUsXG4gICAgICByZW1vdmUgPSB0cnVlLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBhZGQ/OiBib29sZWFuO1xuICAgICAgbWVyZ2U/OiBib29sZWFuO1xuICAgICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICAgIHJlcGFyZW50PzogYm9vbGVhbjtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmFzc2lnbih0aGlzLCBlbnRpdHksIHsgYWRkLCBtZXJnZSwgcmVtb3ZlLCByZXNldCwgc2lsZW50LCByZXBhcmVudCB9KTtcbiAgfVxuXG4gIGNsb25lPE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PigpIHtcbiAgICBsZXQgQ3RvciA9IDx0eXBlb2YgT0RhdGFNb2RlbD50aGlzLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBuZXcgQ3Rvcih0aGlzLnRvRW50aXR5KElOQ0xVREVfU0hBTExPVyksIHtcbiAgICAgIHJlc291cmNlOiB0aGlzLnJlc291cmNlKCkgYXMgT0RhdGFSZXNvdXJjZTxUPixcbiAgICAgIGFubm90czogdGhpcy5hbm5vdHMoKSxcbiAgICB9KSBhcyBNO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWVzdDxULCBSPihcbiAgICBvYnMkOiBPYnNlcnZhYmxlPFQ+LFxuICAgIG1hcENhbGxiYWNrOiAocmVzcG9uc2U6IFQpID0+IFJcbiAgKTogT2JzZXJ2YWJsZTxSPiB7XG4gICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXF1ZXN0LCB7XG4gICAgICBvcHRpb25zOiB7IG9ic2VydmFibGU6IG9icyQgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gb2JzJC5waXBlKFxuICAgICAgbWFwKChyZXNwb25zZSkgPT4gbWFwQ2FsbGJhY2socmVzcG9uc2UpKSxcbiAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuU3luYykpXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoKHtcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCFyZXNvdXJjZSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignZmV0Y2g6IFJlc291cmNlIGlzIG51bGwnKSk7XG5cbiAgICBsZXQgb2JzJDogT2JzZXJ2YWJsZTxPRGF0YUVudGl0eTxUPj47XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkge1xuICAgICAgb2JzJCA9IHJlc291cmNlLmZldGNoKG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKSB7XG4gICAgICBvYnMkID0gcmVzb3VyY2UuZmV0Y2goeyByZXNwb25zZVR5cGU6ICdlbnRpdHknLCAuLi5vcHRpb25zIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYnMkID0gKHJlc291cmNlIGFzIE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPikuZmV0Y2goe1xuICAgICAgICByZXNwb25zZVR5cGU6ICdlbnRpdHknLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsICh7IGVudGl0eSwgYW5ub3RzIH0pID0+IHtcbiAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgdGhpcy5hc3NpZ24oYW5ub3RzLmF0dHJpYnV0ZXMoZW50aXR5IHx8IHt9LCAnZnVsbCcpLCB7IHJlc2V0OiB0cnVlIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSk7XG4gIH1cblxuICBzYXZlKHtcbiAgICBtZXRob2QsXG4gICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIHZhbGlkYXRlID0gdHJ1ZSxcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgdmFsaWRhdGU/OiBib29sZWFuO1xuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnM7XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIXJlc291cmNlKSByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ3NhdmU6IFJlc291cmNlIGlzIG51bGwnKSk7XG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlIHx8XG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZVxuICAgICAgKVxuICAgIClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICdzYXZlOiBSZXNvdXJjZSB0eXBlIE9EYXRhRW50aXR5UmVzb3VyY2UvT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSBuZWVkZWQnXG4gICAgICAgICAgKVxuICAgICAgKTtcblxuICAgIC8vIFJlc29sdmUgbWV0aG9kIGFuZCByZXNvdXJjZSBrZXlcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQgJiYgdGhpcy5zY2hlbWEoKS5pc0NvbXBvdW5kS2V5KCkpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnc2F2ZTogQ29tcG9zaXRlIGtleSByZXF1aXJlIGEgc3BlY2lmaWMgbWV0aG9kLCB1c2UgY3JlYXRlL3VwZGF0ZS9tb2RpZnknXG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICBtZXRob2QgPSBtZXRob2QgfHwgKCFyZXNvdXJjZS5oYXNLZXkoKSA/ICdjcmVhdGUnIDogJ3VwZGF0ZScpO1xuICAgIGlmIChcbiAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSAmJlxuICAgICAgKG1ldGhvZCA9PT0gJ3VwZGF0ZScgfHwgbWV0aG9kID09PSAnbW9kaWZ5JykgJiZcbiAgICAgICFyZXNvdXJjZS5oYXNLZXkoKVxuICAgIClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PiBuZXcgRXJyb3IoJ3NhdmU6IFVwZGF0ZS9QYXRjaCByZXF1aXJlIGVudGl0eSBrZXknKVxuICAgICAgKTtcbiAgICBpZiAoXG4gICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UgfHxcbiAgICAgIG1ldGhvZCA9PT0gJ2NyZWF0ZSdcbiAgICApXG4gICAgICByZXNvdXJjZS5jbGVhcktleSgpO1xuXG4gICAgaWYgKHZhbGlkYXRlICYmICF0aGlzLmlzVmFsaWQoeyBtZXRob2QsIG5hdmlnYXRpb24gfSkpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignc2F2ZTogVmFsaWRhdGlvbiBlcnJvcnMnKSk7XG4gICAgfVxuICAgIGNvbnN0IF9lbnRpdHkgPSB0aGlzLnRvRW50aXR5KHtcbiAgICAgIGNoYW5nZXNfb25seTogbWV0aG9kID09PSAnbW9kaWZ5JyxcbiAgICAgIGZpZWxkX21hcHBpbmc6IHRydWUsXG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5OiB0cnVlLFxuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBuYXZpZ2F0aW9uLFxuICAgIH0pO1xuICAgIGxldCBvYnMkID1cbiAgICAgIG1ldGhvZCA9PT0gJ2NyZWF0ZSdcbiAgICAgICAgPyByZXNvdXJjZS5jcmVhdGUoX2VudGl0eSBhcyBULCBvcHRpb25zKVxuICAgICAgICA6IG1ldGhvZCA9PT0gJ21vZGlmeSdcbiAgICAgICAgICA/IHJlc291cmNlLm1vZGlmeShfZW50aXR5IGFzIFQsIHtcbiAgICAgICAgICAgIGV0YWc6IHRoaXMuYW5ub3RzKCkuZXRhZyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgfSlcbiAgICAgICAgICA6IHJlc291cmNlLnVwZGF0ZShfZW50aXR5IGFzIFQsIHtcbiAgICAgICAgICAgIGV0YWc6IHRoaXMuYW5ub3RzKCkuZXRhZyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCwgKHsgZW50aXR5LCBhbm5vdHMgfSkgPT4ge1xuICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdHM7XG4gICAgICB0aGlzLmFzc2lnbihcbiAgICAgICAgYW5ub3RzLmF0dHJpYnV0ZXMoXG4gICAgICAgICAgZW50aXR5IHx8IChfZW50aXR5IGFzIHsgW25hbWU6IHN0cmluZ106IGFueSB9KSxcbiAgICAgICAgICAnZnVsbCdcbiAgICAgICAgKSxcbiAgICAgICAgeyByZXNldDogdHJ1ZSB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSk7XG4gIH1cblxuICBkZXN0cm95KHtcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCFyZXNvdXJjZSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignZGVzdHJveTogUmVzb3VyY2UgaXMgbnVsbCcpKTtcblxuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSB8fFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2VcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnZGVzdHJveTogUmVzb3VyY2UgdHlwZSBPRGF0YUVudGl0eVJlc291cmNlL09EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UgbmVlZGVkJ1xuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgaWYgKCFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PiBuZXcgRXJyb3IoXCJkZXN0cm95OiBDYW4ndCBkZXN0cm95IG1vZGVsIHdpdGhvdXQga2V5XCIpXG4gICAgICApO1xuXG4gICAgY29uc3QgX2VudGl0eSA9IHRoaXMudG9FbnRpdHkoeyBmaWVsZF9tYXBwaW5nOiB0cnVlIH0pIGFzIFQ7XG4gICAgY29uc3Qgb2JzJCA9IHJlc291cmNlLmRlc3Ryb3koeyBldGFnOiB0aGlzLmFubm90cygpLmV0YWcsIC4uLm9wdGlvbnMgfSk7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCwgKHJlc3ApID0+IHtcbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuRGVzdHJveSk7XG4gICAgICByZXR1cm4gcmVzcDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZXhlY3V0aW9uIGNvbnRleHQgZm9yIGNoYW5nZSB0aGUgaW50ZXJuYWwgcXVlcnkgb2YgYSByZXNvdXJjZVxuICAgKiBAcGFyYW0gY3R4IEZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAgICovXG4gIHF1ZXJ5KFxuICAgIGN0eDogKHE6IE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcjxUPiwgcz86IE9EYXRhU3RydWN0dXJlZFR5cGU8VD4pID0+IHZvaWRcbiAgKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgcmV0dXJuIChyZXNvdXJjZSA/IHRoaXMuX21ldGEucXVlcnkodGhpcywgcmVzb3VyY2UsIGN0eCkgOiB0aGlzKSBhcyB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBjaGVjayBvbiB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIG1vZGVsIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kZWwgaXMgY2hhbmdlZC5cbiAgICogQHBhcmFtIGluY2x1ZGVfbmF2aWdhdGlvbiBDaGVjayBpbiBuYXZpZ2F0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgbW9kZWwgaGFzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgaGFzQ2hhbmdlZCh7XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5oYXNDaGFuZ2VkKHRoaXMsIHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pO1xuICB9XG5cbiAgZW5jb2RlPEU+KG5hbWU6IGtleW9mIFQsIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKSB7XG4gICAgbGV0IHZhbHVlID0gKDxhbnk+dGhpcylbbmFtZV07XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IGZpZWxkID0gdGhpcy5fbWV0YS5maW5kRmllbGQ8RT4obmFtZSk7XG4gICAgcmV0dXJuIGZpZWxkID8gZmllbGQuZW5jb2RlKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xuICB9XG5cbiAgaXNOZXcoKSB7XG4gICAgcmV0dXJuICF0aGlzLl9tZXRhLmhhc0tleSh0aGlzKTtcbiAgfVxuXG4gIHdpdGhSZXNvdXJjZTxSPihyZXNvdXJjZTogYW55LCBjdHg6IChtb2RlbDogdGhpcykgPT4gUik6IFIge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLndpdGhSZXNvdXJjZSh0aGlzLCByZXNvdXJjZSwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZXhlY3V0aW9uIGNvbnRleHQgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24sIHdoZXJlIHRoZSBtb2RlbCBpcyBib3VuZCB0byBpdHMgZW50aXR5IGVuZHBvaW50XG4gICAqIEBwYXJhbSBjdHggQ29udGV4dCBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBjb250ZXh0XG4gICAqL1xuICBhc0VudGl0eTxSPihjdHg6IChtb2RlbDogdGhpcykgPT4gUik6IFIge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmFzRW50aXR5KHRoaXMsIGN0eCk7XG4gIH1cblxuICAvLyNyZWdpb24gQ2FsbGFibGVzXG4gIGNhbGxGdW5jdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6XG4gICAgICB8ICdwcm9wZXJ0eSdcbiAgICAgIHwgJ21vZGVsJ1xuICAgICAgfCAnY29sbGVjdGlvbidcbiAgICAgIHwgJ25vbmUnXG4gICAgICB8ICdibG9iJ1xuICAgICAgfCAnYXJyYXlidWZmZXInLFxuICAgIG9wdGlvbnM6IE9EYXRhRnVuY3Rpb25PcHRpb25zPFI+ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxcbiAgICB8IFJcbiAgICB8IE9EYXRhTW9kZWw8Uj5cbiAgICB8IE9EYXRhQ29sbGVjdGlvbjxSLCBPRGF0YU1vZGVsPFI+PlxuICAgIHwgbnVsbFxuICAgIHwgQmxvYlxuICAgIHwgQXJyYXlCdWZmZXJcbiAgPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB8fCAhcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcImNhbGxGdW5jdGlvbjogQ2FuJ3QgY2FsbCBmdW5jdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5UmVzb3VyY2Ugd2l0aCBrZXlcIlxuICAgICAgICAgIClcbiAgICAgICk7XG5cbiAgICBjb25zdCBmdW5jID0gcmVzb3VyY2UuZnVuY3Rpb248UCwgUj4obmFtZSkucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgZnVuYy5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcFxuICAgICAgICApO1xuICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChmdW5jLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpLCAocmVzcCkgPT4gcmVzcCk7XG4gICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgZnVuYy5jYWxsQ29sbGVjdGlvbihwYXJhbXMsIG9wdGlvbnMpLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwXG4gICAgICAgICk7XG4gICAgICBjYXNlICdibG9iJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoZnVuYy5jYWxsQmxvYihwYXJhbXMsIG9wdGlvbnMpLCAocmVzcCkgPT4gcmVzcCk7XG4gICAgICBjYXNlICdhcnJheWJ1ZmZlcic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGZ1bmMuY2FsbEFycmF5YnVmZmVyKHBhcmFtcywgb3B0aW9ucyksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3BcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGZ1bmMuY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlLCAuLi5vcHRpb25zIH0pLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY2FsbEFjdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU/OlxuICAgICAgfCAncHJvcGVydHknXG4gICAgICB8ICdtb2RlbCdcbiAgICAgIHwgJ2NvbGxlY3Rpb24nXG4gICAgICB8ICdub25lJ1xuICAgICAgfCAnYmxvYidcbiAgICAgIHwgJ2FycmF5YnVmZmVyJyxcbiAgICB7IC4uLm9wdGlvbnMgfToge30gJiBPRGF0YUFjdGlvbk9wdGlvbnM8Uj4gPSB7fVxuICApOiBPYnNlcnZhYmxlPFxuICAgIHwgUlxuICAgIHwgT0RhdGFNb2RlbDxSPlxuICAgIHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+XG4gICAgfCBudWxsXG4gICAgfCBCbG9iXG4gICAgfCBBcnJheUJ1ZmZlclxuICA+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIShyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHx8ICFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIFwiY2FsbEFjdGlvbjogQ2FuJ3QgY2FsbCBhY3Rpb24gd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlIHdpdGgga2V5XCJcbiAgICAgICAgICApXG4gICAgICApO1xuXG4gICAgY29uc3QgYWN0aW9uID0gcmVzb3VyY2UuYWN0aW9uPFAsIFI+KG5hbWUpLnF1ZXJ5KChxKSA9PiBxLnJlc3RvcmUob3B0aW9ucykpO1xuICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7XG4gICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGFjdGlvbi5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcFxuICAgICAgICApO1xuICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChhY3Rpb24uY2FsbE1vZGVsKHBhcmFtcywgb3B0aW9ucyksIChyZXNwKSA9PiByZXNwKTtcbiAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBhY3Rpb24uY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcFxuICAgICAgICApO1xuICAgICAgY2FzZSAnYmxvYic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KGFjdGlvbi5jYWxsQmxvYihwYXJhbXMsIG9wdGlvbnMpLCAocmVzcCkgPT4gcmVzcCk7XG4gICAgICBjYXNlICdhcnJheWJ1ZmZlcic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGFjdGlvbi5jYWxsQXJyYXlidWZmZXIocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcFxuICAgICAgICApO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgYWN0aW9uLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyBDYXN0XG4gIGNhc3Q8Uz4odHlwZTogc3RyaW5nKSB7XG4gICAgLy86IE9EYXRhTW9kZWw8Uz4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYXN0OiBDYW4ndCBjYXN0IHRvIGRlcml2ZWQgbW9kZWwgd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlYFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXNvdXJjZVxuICAgICAgLmNhc3Q8Uz4odHlwZSlcbiAgICAgIC5hc01vZGVsKHRoaXMudG9FbnRpdHkoSU5DTFVERV9ERUVQKSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSwge1xuICAgICAgICBhbm5vdHM6IHRoaXMuYW5ub3RzKCkgYXMgYW55LFxuICAgICAgfSk7XG4gIH1cblxuICBmZXRjaE5hdmlnYXRpb25Qcm9wZXJ0eTxTPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIHJlc3BvbnNlVHlwZTogJ21vZGVsJyB8ICdjb2xsZWN0aW9uJyxcbiAgICBvcHRpb25zOiBPRGF0YVF1ZXJ5QXJndW1lbnRzT3B0aW9uczxTPiA9IHt9XG4gICk6IE9ic2VydmFibGU8T0RhdGFNb2RlbDxTPiB8IE9EYXRhQ29sbGVjdGlvbjxTLCBPRGF0YU1vZGVsPFM+PiB8IG51bGw+IHtcbiAgICBjb25zdCBuYXYgPSB0aGlzLm5hdmlnYXRpb25Qcm9wZXJ0eTxTPihcbiAgICAgIG5hbWVcbiAgICApIGFzIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Uz47XG4gICAgbmF2LnF1ZXJ5KChxKSA9PiBxLnJlc3RvcmUob3B0aW9ucykpO1xuICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiBuYXYuZmV0Y2hNb2RlbChvcHRpb25zKTtcbiAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICByZXR1cm4gbmF2LmZldGNoQ29sbGVjdGlvbihvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBmZXRjaEF0dHJpYnV0ZTxQPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIG9wdGlvbnM6IE9EYXRhUXVlcnlBcmd1bWVudHNPcHRpb25zPFA+ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxQIHwgT0RhdGFNb2RlbDxQPiB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PiB8IG51bGw+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmluZEZpZWxkPFA+KG5hbWUpO1xuICAgIGlmICghZmllbGQpXG4gICAgICB0aHJvdyBFcnJvcihgZmV0Y2hBdHRyaWJ1dGU6IENhbid0IGZpbmQgYXR0cmlidXRlICR7bmFtZSBhcyBzdHJpbmd9YCk7XG5cbiAgICBpZiAoZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpICYmIGZpZWxkLmNvbGxlY3Rpb24pIHtcbiAgICAgIGxldCBjb2xsZWN0aW9uID0gZmllbGQuY29sbGVjdGlvbkZhY3Rvcnk8UD4oeyBwYXJlbnQ6IHRoaXMgfSk7XG4gICAgICBjb2xsZWN0aW9uLnF1ZXJ5KChxKSA9PiBxLnJlc3RvcmUob3B0aW9ucyBhcyBPRGF0YVF1ZXJ5QXJndW1lbnRzPFA+KSk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChjb2xsZWN0aW9uLmZldGNoKG9wdGlvbnMpLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuYXNzaWduKHsgW25hbWVdOiBjb2xsZWN0aW9uIH0pO1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpKSB7XG4gICAgICBsZXQgbW9kZWwgPSBmaWVsZC5tb2RlbEZhY3Rvcnk8UD4oeyBwYXJlbnQ6IHRoaXMgfSk7XG4gICAgICBtb2RlbC5xdWVyeSgocSkgPT4gcS5yZXN0b3JlKG9wdGlvbnMgYXMgT0RhdGFRdWVyeUFyZ3VtZW50czxQPikpO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QobW9kZWwuZmV0Y2gob3B0aW9ucyksICgpID0+IHtcbiAgICAgICAgdGhpcy5hc3NpZ24oeyBbbmFtZV06IG1vZGVsIH0pO1xuICAgICAgICByZXR1cm4gbW9kZWw7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJvcCA9IGZpZWxkLnJlc291cmNlRmFjdG9yeTxULCBQPihcbiAgICAgICAgdGhpcy5yZXNvdXJjZSgpIVxuICAgICAgKSBhcyBPRGF0YVByb3BlcnR5UmVzb3VyY2U8UD47XG4gICAgICBwcm9wLnF1ZXJ5KChxKSA9PiBxLnJlc3RvcmUob3B0aW9ucyBhcyBPRGF0YVF1ZXJ5QXJndW1lbnRzPFA+KSk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChwcm9wLmZldGNoUHJvcGVydHkob3B0aW9ucyksIChyZXNwKSA9PiB7XG4gICAgICAgIHRoaXMuYXNzaWduKHsgW25hbWVdOiByZXNwIH0pO1xuICAgICAgICByZXR1cm4gcmVzcDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldEF0dHJpYnV0ZTxQPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nXG4gICk6IFAgfCBPRGF0YU1vZGVsPFA+IHwgT0RhdGFDb2xsZWN0aW9uPFAsIE9EYXRhTW9kZWw8UD4+IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLl9tZXRhLmZpbmRGaWVsZDxQPihuYW1lKTtcbiAgICBpZiAoIWZpZWxkKVxuICAgICAgdGhyb3cgRXJyb3IoYGdldEF0dHJpYnV0ZTogQ2FuJ3QgZmluZCBhdHRyaWJ1dGUgJHtuYW1lIGFzIHN0cmluZ31gKTtcblxuICAgIGxldCBtb2RlbCA9ICh0aGlzIGFzIGFueSlbbmFtZV0gYXNcbiAgICAgIHwgUFxuICAgICAgfCBPRGF0YU1vZGVsPFA+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PlxuICAgICAgfCBudWxsO1xuICAgIGlmIChmaWVsZC5pc1N0cnVjdHVyZWRUeXBlKCkgJiYgbW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpZWxkLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgbW9kZWwgPSBmaWVsZC5jb2xsZWN0aW9uRmFjdG9yeSh7IHBhcmVudDogdGhpcyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlZiA9IGZpZWxkLm5hdmlnYXRpb25cbiAgICAgICAgICA/ICh0aGlzLnJlZmVyZW5jZWQoZmllbGQpIGFzIFApXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1vZGVsID1cbiAgICAgICAgICByZWYgPT09IG51bGxcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiBmaWVsZC5tb2RlbEZhY3RvcnkoeyBwYXJlbnQ6IHRoaXMsIHZhbHVlOiByZWYgfSk7XG4gICAgICB9XG4gICAgICAodGhpcyBhcyBhbnkpW25hbWVdID0gbW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIHNldEF0dHJpYnV0ZTxOPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPE4+IHwgT0RhdGFDb2xsZWN0aW9uPE4sIE9EYXRhTW9kZWw8Tj4+IHwgbnVsbCxcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zXG4gICk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IChcbiAgICAgIHRoaXMubmF2aWdhdGlvblByb3BlcnR5PE4+KG5hbWUpIGFzIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Tj5cbiAgICApLnJlZmVyZW5jZSgpO1xuXG4gICAgY29uc3QgZXRhZyA9IHRoaXMuYW5ub3RzKCkuZXRhZztcbiAgICBsZXQgb2JzJCA9IE5FVkVSIGFzIE9ic2VydmFibGU8YW55PjtcbiAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBPRGF0YU1vZGVsKSB7XG4gICAgICBvYnMkID0gcmVmZXJlbmNlLnNldChcbiAgICAgICAgbW9kZWwuYXNFbnRpdHkoKGUpID0+IGUucmVzb3VyY2UoKSkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxOPixcbiAgICAgICAgeyBldGFnLCAuLi5vcHRpb25zIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIE9EYXRhQ29sbGVjdGlvbikge1xuICAgICAgb2JzJCA9IGZvcmtKb2luKFxuICAgICAgICBtb2RlbFxuICAgICAgICAgIC5tb2RlbHMoKVxuICAgICAgICAgIC5tYXAoKG0pID0+XG4gICAgICAgICAgICByZWZlcmVuY2UuYWRkKFxuICAgICAgICAgICAgICBtLmFzRW50aXR5KChlKSA9PiBlLnJlc291cmNlKCkpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8Tj4sXG4gICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAobW9kZWwgPT09IG51bGwpIHtcbiAgICAgIG9icyQgPSByZWZlcmVuY2UudW5zZXQoeyBldGFnLCAuLi5vcHRpb25zIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkLCAobW9kZWwpID0+IHtcbiAgICAgIHRoaXMuYXNzaWduKHsgW25hbWVdOiBtb2RlbCB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0UmVmZXJlbmNlPE4+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmcsXG4gICAgbW9kZWw6IE9EYXRhTW9kZWw8Tj4gfCBPRGF0YUNvbGxlY3Rpb248TiwgT0RhdGFNb2RlbDxOPj4gfCBudWxsLFxuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnNcbiAgKTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gKFxuICAgICAgdGhpcy5uYXZpZ2F0aW9uUHJvcGVydHk8Tj4obmFtZSkgYXMgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxOPlxuICAgICkucmVmZXJlbmNlKCk7XG5cbiAgICBjb25zdCBldGFnID0gdGhpcy5hbm5vdHMoKS5ldGFnO1xuICAgIGxldCBvYnMkID0gTkVWRVIgYXMgT2JzZXJ2YWJsZTxhbnk+O1xuICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIE9EYXRhTW9kZWwpIHtcbiAgICAgIG9icyQgPSByZWZlcmVuY2Uuc2V0KFxuICAgICAgICBtb2RlbC5hc0VudGl0eSgoZSkgPT4gZS5yZXNvdXJjZSgpKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPE4+LFxuICAgICAgICB7IGV0YWcsIC4uLm9wdGlvbnMgfVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKSB7XG4gICAgICBvYnMkID0gZm9ya0pvaW4oXG4gICAgICAgIG1vZGVsXG4gICAgICAgICAgLm1vZGVscygpXG4gICAgICAgICAgLm1hcCgobSkgPT5cbiAgICAgICAgICAgIHJlZmVyZW5jZS5hZGQoXG4gICAgICAgICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUucmVzb3VyY2UoKSkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxOPixcbiAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gbnVsbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS51bnNldCh7IGV0YWcsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsIChtb2RlbCkgPT4ge1xuICAgICAgdGhpcy5hc3NpZ24oeyBbbmFtZV06IG1vZGVsIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSk7XG4gIH1cblxuICAvLyNyZWdpb24gTW9kZWwgSWRlbnRpdHlcbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnTW9kZWwnO1xuICB9XG4gIGVxdWFscyhvdGhlcjogT0RhdGFNb2RlbDxUPik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzID09PSBvdGhlcikgcmV0dXJuIHRydWU7XG4gICAgaWYgKHR5cGVvZiB0aGlzICE9PSB0eXBlb2Ygb3RoZXIpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5fbWV0YTtcbiAgICBjb25zdCB0aGlzQ2lkID0gKDxhbnk+dGhpcylbbWV0YS5jaWRdO1xuICAgIGNvbnN0IG90aGVyQ2lkID0gKDxhbnk+b3RoZXIpW21ldGEuY2lkXTtcbiAgICBpZiAoXG4gICAgICB0aGlzQ2lkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG90aGVyQ2lkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIFR5cGVzLmlzRXF1YWwodGhpc0NpZCwgb3RoZXJDaWQpXG4gICAgKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKG1ldGEuaXNFbnRpdHlUeXBlKCkpIHtcbiAgICAgIGNvbnN0IHRoaXNLZXkgPSB0aGlzLmtleSgpO1xuICAgICAgY29uc3Qgb3RoZXJLZXkgPSBvdGhlci5rZXkoKTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpc0tleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIG90aGVyS2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgVHlwZXMuaXNFcXVhbCh0aGlzS2V5LCBvdGhlcktleSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChtZXRhLmlzQ29tcGxleFR5cGUoKSkge1xuICAgICAgY29uc3QgdGhpc0pzb24gPSB0aGlzLnRvSnNvbigpO1xuICAgICAgY29uc3Qgb3RoZXJKc29uID0gb3RoZXIudG9Kc29uKCk7XG4gICAgICBpZiAoVHlwZXMuaXNFcXVhbCh0aGlzSnNvbiwgb3RoZXJKc29uKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gQ29sbGVjdGlvbiBUb29sc1xuICBjb2xsZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnQgIT09IG51bGwgJiZcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih0aGlzLl9wYXJlbnRbMF0pXG4gICAgICA/ICh0aGlzLl9wYXJlbnRbMF0gYXMgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBuZXh0KCk6IE9EYXRhTW9kZWw8VD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb24oKT8ubmV4dCh0aGlzKTtcbiAgfVxuXG4gIHByZXYoKTogT0RhdGFNb2RlbDxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbigpPy5wcmV2KHRoaXMpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxufVxuXG5leHBvcnQgY29uc3QgUkVTRVJWRURfRklFTERfTkFNRVMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhcbiAgT0RhdGFNb2RlbC5wcm90b3R5cGVcbik7XG4iXX0=
|
|
552
|
+
const RESERVED_FIELD_NAMES = Object.getOwnPropertyNames(ODataModel.prototype);
|
|
553
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvbW9kZWxzL21vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFHTCxtQkFBbUIsRUFFbkIsK0JBQStCLEdBUWhDLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFDTCxZQUFZLEVBR1osaUJBQWlCLEVBRWpCLG1CQUFtQixFQUNuQixzQkFBc0IsR0FFdkIsTUFBTSxXQUFXLENBQUM7QUFLbkIsTUFBTSxPQUFPLFVBQVU7SUE4QnJCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBSSxFQUN6QixNQUFNLEVBQ04sY0FBYyxHQUlmO1FBQ0MsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE1BQU0sTUFBTSxHQUFHLGNBQWM7aUJBQzFCLE1BQU0sQ0FBQyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQzNELE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDckIsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDdEIsMkNBQTJDO2dCQUMzQyxPQUFPLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDMUMsSUFBSSxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7aUJBQ25CO2dCQUNE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QUFDLENBQXVDO1lBQ3hELENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUVGO0FBRUQsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ya0pvaW4sIE5FVkVSLCBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRW50aXR5S2V5LFxuICBPRGF0YUFjdGlvbk9wdGlvbnMsXG4gIE9EYXRhRW50aXR5UmVzb3VyY2UsXG4gIE9EYXRhRnVuY3Rpb25PcHRpb25zLFxuICBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YU9wdGlvbnMsXG4gIE9EYXRhUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFRdWVyeUFyZ3VtZW50cyxcbiAgT0RhdGFRdWVyeUFyZ3VtZW50c09wdGlvbnMsXG4gIE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcixcbiAgT0RhdGFSZXNvdXJjZSxcbiAgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSxcbn0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IE9EYXRhU3RydWN0dXJlZFR5cGUgfSBmcm9tICcuLi9zY2hlbWEnO1xuaW1wb3J0IHsgT2JqZWN0cywgU3RyaW5ncywgVHlwZXMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBPRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtcbiAgSU5DTFVERV9ERUVQLFxuICBNb2RlbE9wdGlvbnMsXG4gIE9EYXRhTW9kZWxGaWVsZCxcbiAgT0RhdGFNb2RlbE9wdGlvbnMsXG4gIE9EYXRhTW9kZWxBdHRyaWJ1dGUsXG4gIE9EYXRhTW9kZWxFdmVudFR5cGUsXG4gIE9EYXRhTW9kZWxFdmVudEVtaXR0ZXIsXG4gIE1vZGVsRmllbGRPcHRpb25zLFxufSBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgRWRtVHlwZSwgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IE9EYXRhRW50aXR5QW5ub3RhdGlvbnMgfSBmcm9tICcuLi9hbm5vdGF0aW9ucyc7XG5pbXBvcnQgeyBPRGF0YUVudGl0eSB9IGZyb20gJy4uL3Jlc291cmNlcy9yZXNwb25zZSc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YU1vZGVsPFQ+IHtcbiAgLy8gUHJvcGVydGllc1xuICBzdGF0aWMgb3B0aW9uczogTW9kZWxPcHRpb25zO1xuICBzdGF0aWMgbWV0YTogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgLy8gUGFyZW50XG4gIF9wYXJlbnQ6XG4gICAgfCBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbCxcbiAgICAgIF1cbiAgICB8IG51bGwgPSBudWxsO1xuICBfcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8VD4gfCBudWxsID0gbnVsbDtcbiAgX3Jlc291cmNlczoge1xuICAgIHBhcmVudDpcbiAgICAgIHwgW1xuICAgICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsLFxuICAgICAgICBdXG4gICAgICB8IG51bGw7XG4gICAgcmVzb3VyY2U6IE9EYXRhUmVzb3VyY2U8VD4gfCBudWxsO1xuICB9W10gPSBbXTtcbiAgX2F0dHJpYnV0ZXM6IE1hcDxzdHJpbmcsIE9EYXRhTW9kZWxBdHRyaWJ1dGU8YW55Pj4gPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBPRGF0YU1vZGVsQXR0cmlidXRlPGFueT5cbiAgPigpO1xuICBfYW5ub3RhdGlvbnMhOiBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+O1xuICBfbWV0YTogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgLy8gRXZlbnRzXG4gIGV2ZW50cyQ6IE9EYXRhTW9kZWxFdmVudEVtaXR0ZXI8VD47XG5cbiAgc3RhdGljIGJ1aWxkTWV0YU9wdGlvbnM8VD4oe1xuICAgIGNvbmZpZyxcbiAgICBzdHJ1Y3R1cmVkVHlwZSxcbiAgfToge1xuICAgIGNvbmZpZz86IE1vZGVsT3B0aW9ucztcbiAgICBzdHJ1Y3R1cmVkVHlwZTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPjtcbiAgfSkge1xuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZmllbGRzID0gc3RydWN0dXJlZFR5cGVcbiAgICAgICAgLmZpZWxkcyh7IGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSwgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgZmllbGQpID0+IHtcbiAgICAgICAgICBsZXQgbmFtZSA9IGZpZWxkLm5hbWU7XG4gICAgICAgICAgLy8gUHJldmVudCBjb2xsaXNpb24gd2l0aCByZXNlcnZlZCBrZXl3b3Jkc1xuICAgICAgICAgIHdoaWxlIChSRVNFUlZFRF9GSUVMRF9OQU1FUy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAnXyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywge1xuICAgICAgICAgICAgW25hbWVdOiB7XG4gICAgICAgICAgICAgIGZpZWxkOiBmaWVsZC5uYW1lLFxuICAgICAgICAgICAgICBkZWZhdWx0OiBmaWVsZC5kZWZhdWx0LFxuICAgICAgICAgICAgICByZXF1aXJlZDogIWZpZWxkLm51bGxhYmxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwge30pO1xuICAgICAgY29uZmlnID0ge1xuICAgICAgICBmaWVsZHM6IG5ldyBNYXA8c3RyaW5nLCBNb2RlbEZpZWxkT3B0aW9ucz4oT2JqZWN0LmVudHJpZXMoZmllbGRzKSksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE9EYXRhTW9kZWxPcHRpb25zPFQ+KHsgY29uZmlnLCBzdHJ1Y3R1cmVkVHlwZSB9KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhdGE6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9LFxuICAgIHtcbiAgICAgIHBhcmVudCxcbiAgICAgIHJlc291cmNlLFxuICAgICAgYW5ub3RzLFxuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBwYXJlbnQ/OiBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbCxcbiAgICAgIF07XG4gICAgICByZXNvdXJjZT86IE9EYXRhUmVzb3VyY2U8VD4gfCBudWxsO1xuICAgICAgYW5ub3RzPzogT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxUPjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IEtsYXNzID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT0RhdGFNb2RlbDtcbiAgICBpZiAoS2xhc3MubWV0YSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbDogQ2FuJ3QgY3JlYXRlIG1vZGVsIHdpdGhvdXQgbWV0YWRhdGFgKTtcbiAgICB0aGlzLl9tZXRhID0gS2xhc3MubWV0YTtcbiAgICB0aGlzLmV2ZW50cyQgPSBuZXcgT0RhdGFNb2RlbEV2ZW50RW1pdHRlcjxUPih7IG1vZGVsOiB0aGlzIH0pO1xuICAgIHRoaXMuX21ldGEuYmluZCh0aGlzLCB7IHBhcmVudCwgcmVzb3VyY2UsIGFubm90cyB9KTtcblxuICAgIC8vIENsaWVudCBJZFxuICAgICg8YW55PnRoaXMpW3RoaXMuX21ldGEuY2lkXSA9XG4gICAgICAoPGFueT5kYXRhKVt0aGlzLl9tZXRhLmNpZF0gfHxcbiAgICAgIFN0cmluZ3MudW5pcXVlSWQoe1xuICAgICAgICBwcmVmaXg6IGAke0tsYXNzLm1ldGEuc3RydWN0dXJlZFR5cGUubmFtZS50b0xvd2VyQ2FzZSgpfS1gLFxuICAgICAgfSk7XG5cbiAgICBpZiAoIXJlc2V0KVxuICAgICAgZGF0YSA9IE9iamVjdHMubWVyZ2UoXG4gICAgICAgIHRoaXMuZGVmYXVsdHMoKSxcbiAgICAgICAgZGF0YSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICAgICkgYXMgUGFydGlhbDxUPjtcblxuICAgIHRoaXMuYXNzaWduKGRhdGEsIHsgcmVzZXQgfSk7XG4gIH1cblxuICAvLyNyZWdpb24gUmVzb3VyY2VzXG4gIHJlc291cmNlKCk6XG4gICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgICB8IG51bGwge1xuICAgIHJldHVybiBPRGF0YU1vZGVsT3B0aW9ucy5yZXNvdXJjZTxUPih0aGlzKSBhc1xuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgICAgIHwgbnVsbDtcbiAgfVxuXG4gIHB1c2hSZXNvdXJjZShcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gICAgICB8IG51bGwsXG4gICkge1xuICAgIC8vIFB1c2ggY3VycmVudCBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgdGhpcy5fcmVzb3VyY2VzLnB1c2goeyBwYXJlbnQ6IHRoaXMuX3BhcmVudCwgcmVzb3VyY2U6IHRoaXMuX3Jlc291cmNlIH0pO1xuICAgIC8vIFJlcGxhY2UgcGFyZW50IGFuZCByZXNvdXJjZVxuICAgIHRoaXMuX3BhcmVudCA9IG51bGw7XG4gICAgdGhpcy5fcmVzb3VyY2UgPSByZXNvdXJjZTtcbiAgfVxuXG4gIHBvcFJlc291cmNlKCkge1xuICAgIC8vIFBvcCBwYXJlbnQgYW5kIHJlc291cmNlXG4gICAgY29uc3QgcG9wID0gdGhpcy5fcmVzb3VyY2VzLnBvcCgpO1xuICAgIGlmIChwb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3VycmVudCA9IHsgcGFyZW50OiB0aGlzLl9wYXJlbnQsIHJlc291cmNlOiB0aGlzLl9yZXNvdXJjZSB9O1xuICAgICAgdGhpcy5fcGFyZW50ID0gcG9wLnBhcmVudDtcbiAgICAgIHRoaXMuX3Jlc291cmNlID0gcG9wLnJlc291cmNlO1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBuYXZpZ2F0aW9uUHJvcGVydHk8Tj4oXG4gICAgbmFtZToga2V5b2YgVCB8IHN0cmluZyxcbiAgKTogT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxOPiB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLl9tZXRhLmZpbmRGaWVsZDxOPihuYW1lKTtcbiAgICBpZiAoIWZpZWxkIHx8ICFmaWVsZC5uYXZpZ2F0aW9uKVxuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBuYXZpZ2F0aW9uUHJvcGVydHk6IENhbid0IGZpbmQgbmF2aWdhdGlvbiBwcm9wZXJ0eSAke25hbWUgYXMgc3RyaW5nfWAsXG4gICAgICApO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB8fCAhcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJuYXZpZ2F0aW9uUHJvcGVydHk6IENhbid0IGdldCBuYXZpZ2F0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlSZXNvdXJjZSB3aXRoIGtleVwiLFxuICAgICAgKTtcblxuICAgIHJldHVybiBmaWVsZC5yZXNvdXJjZUZhY3Rvcnk8VCwgTj4oXG4gICAgICByZXNvdXJjZSxcbiAgICApIGFzIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Tj47XG4gIH1cblxuICBwcm9wZXJ0eTxOPihuYW1lOiBzdHJpbmcpOiBPRGF0YVByb3BlcnR5UmVzb3VyY2U8Tj4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fbWV0YS5maW5kRmllbGQ8Tj4obmFtZSk7XG4gICAgaWYgKCFmaWVsZCB8fCBmaWVsZC5uYXZpZ2F0aW9uKVxuICAgICAgdGhyb3cgRXJyb3IoYHByb3BlcnR5OiBDYW4ndCBmaW5kIHByb3BlcnR5ICR7bmFtZX1gKTtcblxuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkgfHwgIXJlc291cmNlLmhhc0tleSgpKVxuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIFwicHJvcGVydHk6IENhbid0IGdldCBwcm9wZXJ0eSB3aXRob3V0IE9EYXRhRW50aXR5UmVzb3VyY2Ugd2l0aCBrZXlcIixcbiAgICAgICk7XG5cbiAgICByZXR1cm4gZmllbGQucmVzb3VyY2VGYWN0b3J5PFQsIE4+KHJlc291cmNlKSBhcyBPRGF0YVByb3BlcnR5UmVzb3VyY2U8Tj47XG4gIH1cblxuICBhdHRhY2goXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPixcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuYXR0YWNoKHRoaXMsIHJlc291cmNlKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBzY2hlbWEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuc3RydWN0dXJlZFR5cGU7XG4gIH1cblxuICBhbm5vdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICB9XG5cbiAga2V5KHtcbiAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgcmVzb2x2ZSA9IHRydWUsXG4gIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuIH0gPSB7fSk6XG4gICAgfCBFbnRpdHlLZXk8VD5cbiAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnJlc29sdmVLZXkodGhpcywgeyBmaWVsZF9tYXBwaW5nLCByZXNvbHZlIH0pO1xuICB9XG5cbiAgaXNPcGVuTW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuaXNPcGVuVHlwZSgpO1xuICB9XG5cbiAgaXNQYXJlbnRPZihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoaWxkICE9PSB0aGlzICYmXG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5jaGFpbihjaGlsZCkuc29tZSgocCkgPT4gcFswXSA9PT0gdGhpcylcbiAgICApO1xuICB9XG5cbiAgcmVmZXJlbnRpYWwoXG4gICAgYXR0cjogT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+IHwgT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9LFxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnJlc29sdmVSZWZlcmVudGlhbCh0aGlzLCBhdHRyLCB7XG4gICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgcmVzb2x2ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHJlZmVyZW5jZWQoXG4gICAgYXR0cjogT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+IHwgT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9LFxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnJlc29sdmVSZWZlcmVuY2VkKHRoaXMsIGF0dHIsIHtcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICByZXNvbHZlLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gVmFsaWRhdGlvblxuICBfZXJyb3JzPzogeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIHZhbGlkYXRlKHtcbiAgICBtZXRob2QsXG4gICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICB9OiB7XG4gICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS52YWxpZGF0ZSh0aGlzLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KTtcbiAgfVxuXG4gIGlzVmFsaWQoe1xuICAgIG1ldGhvZCxcbiAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHtcbiAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gIH0gPSB7fSk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2Vycm9ycyA9IHRoaXMudmFsaWRhdGUoeyBtZXRob2QsIG5hdmlnYXRpb24gfSk7XG4gICAgaWYgKHRoaXMuX2Vycm9ycyAhPT0gdW5kZWZpbmVkKVxuICAgICAgdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5JbnZhbGlkLCB7XG4gICAgICAgIHZhbHVlOiB0aGlzLl9lcnJvcnMsXG4gICAgICAgIG9wdGlvbnM6IHsgbWV0aG9kIH0sXG4gICAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JzID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICBkZWZhdWx0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5kZWZhdWx0cygpIHx8IHt9O1xuICB9XG5cbiAgdG9FbnRpdHkoe1xuICAgIGNsaWVudF9pZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9rZXkgPSB0cnVlLFxuICAgIGluY2x1ZGVfaWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX25vbl9maWVsZCA9IGZhbHNlLFxuICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICBjaGFpbiA9IFtdLFxuICB9OiB7XG4gICAgY2xpZW50X2lkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfa2V5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX2lkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgY2hhbmdlc19vbmx5PzogYm9vbGVhbjtcbiAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgICBjaGFpbj86IChPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVtdO1xuICB9ID0ge30pOiBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnRvRW50aXR5KHRoaXMsIHtcbiAgICAgIGNsaWVudF9pZCxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgaW5jbHVkZV9rZXksXG4gICAgICBpbmNsdWRlX2lkLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQsXG4gICAgICBjaGFuZ2VzX29ubHksXG4gICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgY2hhaW4sXG4gICAgfSk7XG4gIH1cblxuICB0b0pzb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9FbnRpdHkoSU5DTFVERV9ERUVQKTtcbiAgfVxuXG4gIHNldChcbiAgICBwYXRoOiBrZXlvZiBUIHwgc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgdmFsdWU6IGFueSxcbiAgICB7IHR5cGUgfTogeyB0eXBlPzogRWRtVHlwZSB8IHN0cmluZyB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgbW9kZWwgPSAoPGFueT50aGlzKVtwYXRoQXJyYXlbMF1dO1xuICAgICAgcmV0dXJuIG1vZGVsLnNldChwYXRoQXJyYXkuc2xpY2UoMSksIHZhbHVlLCB7fSk7XG4gICAgfVxuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWV0YS5zZXQodGhpcywgcGF0aEFycmF5WzBdLCB2YWx1ZSwgeyB0eXBlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldChwYXRoOiBrZXlvZiBUIHwgc3RyaW5nIHwgc3RyaW5nW10pOiBhbnkge1xuICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgIFR5cGVzLmlzQXJyYXkocGF0aCkgPyBwYXRoIDogKHBhdGggYXMgc3RyaW5nKS5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fbWV0YS5nZXQ8YW55Pih0aGlzLCBwYXRoQXJyYXlbMF0pO1xuICAgIGlmIChcbiAgICAgIHBhdGhBcnJheS5sZW5ndGggPiAxICYmXG4gICAgICAodmFsdWUgaW5zdGFuY2VvZiBPRGF0YU1vZGVsIHx8IHZhbHVlIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKVxuICAgICkge1xuICAgICAgcmV0dXJuIHZhbHVlLmdldChwYXRoQXJyYXkuc2xpY2UoMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBoYXMocGF0aDoga2V5b2YgVCB8IHN0cmluZyB8IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0aEFycmF5ID0gKFxuICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiAocGF0aCBhcyBzdHJpbmcpLm1hdGNoKC8oW15bLlxcXV0pKy9nKVxuICAgICkgYXMgYW55W107XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX21ldGEuZ2V0PGFueT4odGhpcywgcGF0aEFycmF5WzBdKTtcbiAgICBpZiAoXG4gICAgICBwYXRoQXJyYXkubGVuZ3RoID4gMSAmJlxuICAgICAgKHZhbHVlIGluc3RhbmNlb2YgT0RhdGFNb2RlbCB8fCB2YWx1ZSBpbnN0YW5jZW9mIE9EYXRhQ29sbGVjdGlvbilcbiAgICApIHtcbiAgICAgIHJldHVybiB2YWx1ZS5oYXMocGF0aEFycmF5LnNsaWNlKDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICByZXNldCh7XG4gICAgcGF0aCxcbiAgICBzaWxlbnQgPSBmYWxzZSxcbiAgfTogeyBwYXRoPzoga2V5b2YgVCB8IHN0cmluZyB8IHN0cmluZ1tdOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIGNvbnN0IHBhdGhBcnJheTogc3RyaW5nW10gPSAoXG4gICAgICBwYXRoID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBbXVxuICAgICAgICA6IFR5cGVzLmlzQXJyYXkocGF0aClcbiAgICAgICAgICA/IHBhdGhcbiAgICAgICAgICA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBjb25zdCBuYW1lID0gcGF0aEFycmF5WzBdO1xuICAgIGNvbnN0IHZhbHVlID0gbmFtZSAhPT0gdW5kZWZpbmVkID8gKDxhbnk+dGhpcylbbmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkgfHxcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSlcbiAgICApIHtcbiAgICAgIHZhbHVlLnJlc2V0KHsgcGF0aDogcGF0aEFycmF5LnNsaWNlKDEpLCBzaWxlbnQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21ldGEucmVzZXQodGhpcywgeyBuYW1lOiBwYXRoQXJyYXlbMF0sIHNpbGVudCB9KTtcbiAgICB9XG4gIH1cblxuICBjbGVhcih7IHNpbGVudCA9IGZhbHNlIH06IHsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICB0aGlzLl9hdHRyaWJ1dGVzLmNsZWFyKCk7XG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIHRoaXMuZXZlbnRzJC50cmlnZ2VyKE9EYXRhTW9kZWxFdmVudFR5cGUuVXBkYXRlKTtcbiAgICB9XG4gIH1cblxuICBhc3NpZ24oXG4gICAgZW50aXR5OiBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAge1xuICAgICAgYWRkID0gdHJ1ZSxcbiAgICAgIG1lcmdlID0gdHJ1ZSxcbiAgICAgIHJlbW92ZSA9IHRydWUsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgICAgcmVwYXJlbnQgPSBmYWxzZSxcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIGFkZD86IGJvb2xlYW47XG4gICAgICBtZXJnZT86IGJvb2xlYW47XG4gICAgICByZW1vdmU/OiBib29sZWFuO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgICAgcmVwYXJlbnQ/OiBib29sZWFuO1xuICAgICAgc2lsZW50PzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmFzc2lnbih0aGlzLCBlbnRpdHksIHtcbiAgICAgIGFkZCxcbiAgICAgIG1lcmdlLFxuICAgICAgcmVtb3ZlLFxuICAgICAgcmVzZXQsXG4gICAgICBzaWxlbnQsXG4gICAgICByZXBhcmVudCxcbiAgICB9KSBhcyB0aGlzO1xuICB9XG5cbiAgY2xvbmU8TSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+KCkge1xuICAgIHJldHVybiBuZXcgKDx0eXBlb2YgT0RhdGFNb2RlbD50aGlzLmNvbnN0cnVjdG9yKShcbiAgICAgIHRoaXMudG9FbnRpdHkoSU5DTFVERV9ERUVQKSxcbiAgICAgIHtcbiAgICAgICAgcmVzb3VyY2U6IHRoaXMucmVzb3VyY2UoKSBhcyBPRGF0YVJlc291cmNlPFQ+LFxuICAgICAgICBhbm5vdHM6IHRoaXMuYW5ub3RzKCksXG4gICAgICB9LFxuICAgICkgYXMgTTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcXVlc3Q8VCwgUj4oXG4gICAgb2JzJDogT2JzZXJ2YWJsZTxUPixcbiAgICBtYXBDYWxsYmFjazogKHJlc3BvbnNlOiBUKSA9PiBSLFxuICApOiBPYnNlcnZhYmxlPFI+IHtcbiAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLlJlcXVlc3QsIHtcbiAgICAgIG9wdGlvbnM6IHsgb2JzZXJ2YWJsZTogb2JzJCB9LFxuICAgIH0pO1xuICAgIHJldHVybiBvYnMkLnBpcGUoXG4gICAgICBtYXAoKHJlc3BvbnNlKSA9PiBtYXBDYWxsYmFjayhyZXNwb25zZSkpLFxuICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5TeW5jKSksXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoKHtcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIXJlc291cmNlKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdmZXRjaDogUmVzb3VyY2UgaXMgbnVsbCcpKTtcblxuICAgIGxldCBvYnMkOiBPYnNlcnZhYmxlPE9EYXRhRW50aXR5PFQ+PjtcbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB7XG4gICAgICBvYnMkID0gcmVzb3VyY2UuZmV0Y2gob3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UpIHtcbiAgICAgIG9icyQgPSByZXNvdXJjZS5mZXRjaCh7IHJlc3BvbnNlVHlwZTogJ2VudGl0eScsIC4uLm9wdGlvbnMgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9icyQgPSAocmVzb3VyY2UgYXMgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+KS5mZXRjaCh7XG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2VudGl0eScsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3Qob2JzJCwgKHsgZW50aXR5LCBhbm5vdHMgfSkgPT4ge1xuICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdHM7XG4gICAgICByZXR1cm4gdGhpcy5hc3NpZ24oZW50aXR5ID8/IHt9LCB7IHJlc2V0OiB0cnVlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2F2ZSh7XG4gICAgbWV0aG9kLFxuICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB2YWxpZGF0ZSA9IHRydWUsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIHZhbGlkYXRlPzogYm9vbGVhbjtcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIXJlc291cmNlKSByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ3NhdmU6IFJlc291cmNlIGlzIG51bGwnKSk7XG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlIHx8XG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZVxuICAgICAgKVxuICAgIClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICdzYXZlOiBSZXNvdXJjZSB0eXBlIE9EYXRhRW50aXR5UmVzb3VyY2UvT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSBuZWVkZWQnLFxuICAgICAgICAgICksXG4gICAgICApO1xuXG4gICAgLy8gUmVzb2x2ZSBtZXRob2QgYW5kIHJlc291cmNlIGtleVxuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnNjaGVtYSgpLmlzQ29tcG91bmRLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICdzYXZlOiBDb21wb3NpdGUga2V5IHJlcXVpcmUgYSBzcGVjaWZpYyBtZXRob2QsIHVzZSBjcmVhdGUvdXBkYXRlL21vZGlmeScsXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgbWV0aG9kID0gbWV0aG9kIHx8ICghcmVzb3VyY2UuaGFzS2V5KCkgPyAnY3JlYXRlJyA6ICd1cGRhdGUnKTtcbiAgICBpZiAoXG4gICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgJiZcbiAgICAgIChtZXRob2QgPT09ICd1cGRhdGUnIHx8IG1ldGhvZCA9PT0gJ21vZGlmeScpICYmXG4gICAgICAhcmVzb3VyY2UuaGFzS2V5KClcbiAgICApXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgKCkgPT4gbmV3IEVycm9yKCdzYXZlOiBVcGRhdGUvUGF0Y2ggcmVxdWlyZSBlbnRpdHkga2V5JyksXG4gICAgICApO1xuICAgIGlmIChcbiAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSB8fFxuICAgICAgbWV0aG9kID09PSAnY3JlYXRlJ1xuICAgIClcbiAgICAgIHJlc291cmNlLmNsZWFyS2V5KCk7XG5cbiAgICBpZiAodmFsaWRhdGUgJiYgIXRoaXMuaXNWYWxpZCh7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSkge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdzYXZlOiBWYWxpZGF0aW9uIGVycm9ycycpKTtcbiAgICB9XG4gICAgY29uc3QgX2VudGl0eSA9IHRoaXMudG9FbnRpdHkoe1xuICAgICAgY2hhbmdlc19vbmx5OiBtZXRob2QgPT09ICdtb2RpZnknLFxuICAgICAgZmllbGRfbWFwcGluZzogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k6IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IG5hdmlnYXRpb24sXG4gICAgfSk7XG4gICAgY29uc3Qgb2JzJCA9XG4gICAgICBtZXRob2QgPT09ICdjcmVhdGUnXG4gICAgICAgID8gcmVzb3VyY2UuY3JlYXRlKF9lbnRpdHkgYXMgVCwgb3B0aW9ucylcbiAgICAgICAgOiBtZXRob2QgPT09ICdtb2RpZnknXG4gICAgICAgICAgPyByZXNvdXJjZS5tb2RpZnkoX2VudGl0eSBhcyBULCB7XG4gICAgICAgICAgICAgIGV0YWc6IHRoaXMuYW5ub3RzKCkuZXRhZyxcbiAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiByZXNvdXJjZS51cGRhdGUoX2VudGl0eSBhcyBULCB7XG4gICAgICAgICAgICAgIGV0YWc6IHRoaXMuYW5ub3RzKCkuZXRhZyxcbiAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsICh7IGVudGl0eSwgYW5ub3RzIH0pID0+IHtcbiAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgcmV0dXJuIHRoaXMuYXNzaWduKGVudGl0eSA/PyAoX2VudGl0eSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSksIHtcbiAgICAgICAgcmVzZXQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlc3Ryb3koe1xuICAgIC4uLm9wdGlvbnNcbiAgfTogT0RhdGFPcHRpb25zICYge1xuICAgIG9wdGlvbnM/OiBPRGF0YU9wdGlvbnM7XG4gIH0gPSB7fSkge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghcmVzb3VyY2UpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ2Rlc3Ryb3k6IFJlc291cmNlIGlzIG51bGwnKSk7XG5cbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UgfHxcbiAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlXG4gICAgICApXG4gICAgKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ2Rlc3Ryb3k6IFJlc291cmNlIHR5cGUgT0RhdGFFbnRpdHlSZXNvdXJjZS9PRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlIG5lZWRlZCcsXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgaWYgKCFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAoKSA9PiBuZXcgRXJyb3IoXCJkZXN0cm95OiBDYW4ndCBkZXN0cm95IG1vZGVsIHdpdGhvdXQga2V5XCIpLFxuICAgICAgKTtcblxuICAgIGNvbnN0IG9icyQgPSByZXNvdXJjZS5kZXN0cm95KHsgZXRhZzogdGhpcy5hbm5vdHMoKS5ldGFnLCAuLi5vcHRpb25zIH0pO1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsIChyZXNwKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLkRlc3Ryb3kpO1xuICAgICAgcmV0dXJuIHJlc3A7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGV4ZWN1dGlvbiBjb250ZXh0IGZvciBjaGFuZ2UgdGhlIGludGVybmFsIHF1ZXJ5IG9mIGEgcmVzb3VyY2VcbiAgICogQHBhcmFtIGN0eCBGdW5jdGlvbiB0byBleGVjdXRlXG4gICAqL1xuICBxdWVyeShcbiAgICBjdHg6IChxOiBPRGF0YVF1ZXJ5T3B0aW9uc0hhbmRsZXI8VD4sIHM/OiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+KSA9PiB2b2lkLFxuICApIHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICByZXR1cm4gKHJlc291cmNlID8gdGhpcy5fbWV0YS5xdWVyeSh0aGlzLCByZXNvdXJjZSwgY3R4KSA6IHRoaXMpIGFzIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIGNoZWNrIG9uIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgbW9kZWwgYW5kIHJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBpcyBjaGFuZ2VkLlxuICAgKiBAcGFyYW0gaW5jbHVkZV9uYXZpZ2F0aW9uIENoZWNrIGluIG5hdmlnYXRpb24gcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBtb2RlbCBoYXMgY2hhbmdlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBoYXNDaGFuZ2VkKHtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgfTogeyBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmhhc0NoYW5nZWQodGhpcywgeyBpbmNsdWRlX25hdmlnYXRpb24gfSk7XG4gIH1cblxuICBlbmNvZGU8RT4obmFtZToga2V5b2YgVCwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9ICg8YW55PnRoaXMpW25hbWVdO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fbWV0YS5maW5kRmllbGQ8RT4obmFtZSk7XG4gICAgcmV0dXJuIGZpZWxkID8gZmllbGQuZW5jb2RlKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xuICB9XG5cbiAgaXNOZXcoKSB7XG4gICAgcmV0dXJuICF0aGlzLl9tZXRhLmhhc0tleSh0aGlzKTtcbiAgfVxuXG4gIHdpdGhSZXNvdXJjZTxSPihyZXNvdXJjZTogYW55LCBjdHg6IChtb2RlbDogdGhpcykgPT4gUik6IFIge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLndpdGhSZXNvdXJjZSh0aGlzLCByZXNvdXJjZSwgY3R4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZXhlY3V0aW9uIGNvbnRleHQgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24sIHdoZXJlIHRoZSBtb2RlbCBpcyBib3VuZCB0byBpdHMgZW50aXR5IGVuZHBvaW50XG4gICAqIEBwYXJhbSBjdHggQ29udGV4dCBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBjb250ZXh0XG4gICAqL1xuICBhc0VudGl0eTxSPihjdHg6IChtb2RlbDogdGhpcykgPT4gUik6IFIge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmFzRW50aXR5KHRoaXMsIGN0eCk7XG4gIH1cblxuICAvLyNyZWdpb24gQ2FsbGFibGVzXG4gIGNhbGxGdW5jdGlvbjxQLCBSPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBQIHwgbnVsbCxcbiAgICByZXNwb25zZVR5cGU6XG4gICAgICB8ICdwcm9wZXJ0eSdcbiAgICAgIHwgJ21vZGVsJ1xuICAgICAgfCAnY29sbGVjdGlvbidcbiAgICAgIHwgJ25vbmUnXG4gICAgICB8ICdibG9iJ1xuICAgICAgfCAnYXJyYXlidWZmZXInLFxuICAgIG9wdGlvbnM6IE9EYXRhRnVuY3Rpb25PcHRpb25zPFI+ID0ge30sXG4gICk6IE9ic2VydmFibGU8XG4gICAgfCBSXG4gICAgfCBPRGF0YU1vZGVsPFI+XG4gICAgfCBPRGF0YUNvbGxlY3Rpb248UiwgT0RhdGFNb2RlbDxSPj5cbiAgICB8IG51bGxcbiAgICB8IEJsb2JcbiAgICB8IEFycmF5QnVmZmVyXG4gID4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkgfHwgIXJlc291cmNlLmhhc0tleSgpKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJjYWxsRnVuY3Rpb246IENhbid0IGNhbGwgZnVuY3Rpb24gd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlIHdpdGgga2V5XCIsXG4gICAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICBjb25zdCBmdW5jID0gcmVzb3VyY2UuZnVuY3Rpb248UCwgUj4obmFtZSkucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgZnVuYy5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoZnVuYy5jYWxsTW9kZWwocGFyYW1zLCBvcHRpb25zKSwgKHJlc3ApID0+IHJlc3ApO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGZ1bmMuY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ2Jsb2InOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChmdW5jLmNhbGxCbG9iKHBhcmFtcywgb3B0aW9ucyksIChyZXNwKSA9PiByZXNwKTtcbiAgICAgIGNhc2UgJ2FycmF5YnVmZmVyJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoXG4gICAgICAgICAgZnVuYy5jYWxsQXJyYXlidWZmZXIocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGZ1bmMuY2FsbChwYXJhbXMsIHsgcmVzcG9uc2VUeXBlLCAuLi5vcHRpb25zIH0pLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxBY3Rpb248UCwgUj4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgcmVzcG9uc2VUeXBlPzpcbiAgICAgIHwgJ3Byb3BlcnR5J1xuICAgICAgfCAnbW9kZWwnXG4gICAgICB8ICdjb2xsZWN0aW9uJ1xuICAgICAgfCAnbm9uZSdcbiAgICAgIHwgJ2Jsb2InXG4gICAgICB8ICdhcnJheWJ1ZmZlcicsXG4gICAgeyAuLi5vcHRpb25zIH06IHt9ICYgT0RhdGFBY3Rpb25PcHRpb25zPFI+ID0ge30sXG4gICk6IE9ic2VydmFibGU8XG4gICAgfCBSXG4gICAgfCBPRGF0YU1vZGVsPFI+XG4gICAgfCBPRGF0YUNvbGxlY3Rpb248UiwgT0RhdGFNb2RlbDxSPj5cbiAgICB8IG51bGxcbiAgICB8IEJsb2JcbiAgICB8IEFycmF5QnVmZmVyXG4gID4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkgfHwgIXJlc291cmNlLmhhc0tleSgpKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJjYWxsQWN0aW9uOiBDYW4ndCBjYWxsIGFjdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5UmVzb3VyY2Ugd2l0aCBrZXlcIixcbiAgICAgICAgICApLFxuICAgICAgKTtcblxuICAgIGNvbnN0IGFjdGlvbiA9IHJlc291cmNlLmFjdGlvbjxQLCBSPihuYW1lKS5xdWVyeSgocSkgPT4gcS5yZXN0b3JlKG9wdGlvbnMpKTtcbiAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChcbiAgICAgICAgICBhY3Rpb24uY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KGFjdGlvbi5jYWxsTW9kZWwocGFyYW1zLCBvcHRpb25zKSwgKHJlc3ApID0+IHJlc3ApO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGFjdGlvbi5jYWxsQ29sbGVjdGlvbihwYXJhbXMsIG9wdGlvbnMpLFxuICAgICAgICAgIChyZXNwKSA9PiByZXNwLFxuICAgICAgICApO1xuICAgICAgY2FzZSAnYmxvYic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KGFjdGlvbi5jYWxsQmxvYihwYXJhbXMsIG9wdGlvbnMpLCAocmVzcCkgPT4gcmVzcCk7XG4gICAgICBjYXNlICdhcnJheWJ1ZmZlcic6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGFjdGlvbi5jYWxsQXJyYXlidWZmZXIocGFyYW1zLCBvcHRpb25zKSxcbiAgICAgICAgICAocmVzcCkgPT4gcmVzcCxcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KFxuICAgICAgICAgIGFjdGlvbi5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSksXG4gICAgICAgICAgKHJlc3ApID0+IHJlc3AsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vIENhc3RcbiAgY2FzdDxTPih0eXBlOiBzdHJpbmcsIE1vZGVsVHlwZT86IHR5cGVvZiBPRGF0YU1vZGVsKSB7XG4gICAgLy86IE9EYXRhTW9kZWw8Uz4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYXN0OiBDYW4ndCBjYXN0IHRvIGRlcml2ZWQgbW9kZWwgd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlYCxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzb3VyY2VcbiAgICAgIC5jYXN0PFM+KHR5cGUpXG4gICAgICAuYXNNb2RlbCh0aGlzLnRvRW50aXR5KElOQ0xVREVfREVFUCkgYXMgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sIHtcbiAgICAgICAgYW5ub3RzOiB0aGlzLmFubm90cygpIGFzIGFueSxcbiAgICAgICAgTW9kZWxUeXBlLFxuICAgICAgfSk7XG4gIH1cblxuICBmZXRjaE5hdmlnYXRpb25Qcm9wZXJ0eTxTPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIHJlc3BvbnNlVHlwZTogJ21vZGVsJyB8ICdjb2xsZWN0aW9uJyxcbiAgICBvcHRpb25zOiBPRGF0YVF1ZXJ5QXJndW1lbnRzT3B0aW9uczxTPiA9IHt9LFxuICApOiBPYnNlcnZhYmxlPE9EYXRhTW9kZWw8Uz4gfCBPRGF0YUNvbGxlY3Rpb248UywgT0RhdGFNb2RlbDxTPj4gfCBudWxsPiB7XG4gICAgY29uc3QgbmF2ID0gdGhpcy5uYXZpZ2F0aW9uUHJvcGVydHk8Uz4oXG4gICAgICBuYW1lLFxuICAgICkgYXMgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxTPjtcbiAgICBuYXYucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgcmV0dXJuIG5hdi5mZXRjaE1vZGVsKG9wdGlvbnMpO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBuYXYuZmV0Y2hDb2xsZWN0aW9uKG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIGZldGNoQXR0cmlidXRlPFA+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmcsXG4gICAgb3B0aW9uczogT0RhdGFRdWVyeUFyZ3VtZW50c09wdGlvbnM8UD4gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxQIHwgT0RhdGFNb2RlbDxQPiB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PiB8IG51bGw+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmluZEZpZWxkPFA+KG5hbWUpO1xuICAgIGlmICghZmllbGQpXG4gICAgICB0aHJvdyBFcnJvcihgZmV0Y2hBdHRyaWJ1dGU6IENhbid0IGZpbmQgYXR0cmlidXRlICR7bmFtZSBhcyBzdHJpbmd9YCk7XG5cbiAgICBpZiAoZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpICYmIGZpZWxkLmNvbGxlY3Rpb24pIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBmaWVsZC5jb2xsZWN0aW9uRmFjdG9yeTxQPih7IHBhcmVudDogdGhpcyB9KTtcbiAgICAgIGNvbGxlY3Rpb24ucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zIGFzIE9EYXRhUXVlcnlBcmd1bWVudHM8UD4pKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KGNvbGxlY3Rpb24uZmV0Y2gob3B0aW9ucyksICgpID0+IHtcbiAgICAgICAgdGhpcy5hc3NpZ24oeyBbbmFtZV06IGNvbGxlY3Rpb24gfSk7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChmaWVsZC5pc1N0cnVjdHVyZWRUeXBlKCkpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gZmllbGQubW9kZWxGYWN0b3J5PFA+KHsgcGFyZW50OiB0aGlzIH0pO1xuICAgICAgbW9kZWwucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zIGFzIE9EYXRhUXVlcnlBcmd1bWVudHM8UD4pKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG1vZGVsLmZldGNoKG9wdGlvbnMpLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuYXNzaWduKHsgW25hbWVdOiBtb2RlbCB9KTtcbiAgICAgICAgcmV0dXJuIG1vZGVsO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByb3AgPSBmaWVsZC5yZXNvdXJjZUZhY3Rvcnk8VCwgUD4oXG4gICAgICAgIHRoaXMucmVzb3VyY2UoKSEsXG4gICAgICApIGFzIE9EYXRhUHJvcGVydHlSZXNvdXJjZTxQPjtcbiAgICAgIHByb3AucXVlcnkoKHEpID0+IHEucmVzdG9yZShvcHRpb25zIGFzIE9EYXRhUXVlcnlBcmd1bWVudHM8UD4pKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHByb3AuZmV0Y2hQcm9wZXJ0eShvcHRpb25zKSwgKHJlc3ApID0+IHtcbiAgICAgICAgdGhpcy5hc3NpZ24oeyBbbmFtZV06IHJlc3AgfSk7XG4gICAgICAgIHJldHVybiByZXNwO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXR0cmlidXRlPFA+KFxuICAgIG5hbWU6IGtleW9mIFQgfCBzdHJpbmcsXG4gICk6IFAgfCBPRGF0YU1vZGVsPFA+IHwgT0RhdGFDb2xsZWN0aW9uPFAsIE9EYXRhTW9kZWw8UD4+IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLl9tZXRhLmZpbmRGaWVsZDxQPihuYW1lKTtcbiAgICBpZiAoIWZpZWxkKVxuICAgICAgdGhyb3cgRXJyb3IoYGdldEF0dHJpYnV0ZTogQ2FuJ3QgZmluZCBhdHRyaWJ1dGUgJHtuYW1lIGFzIHN0cmluZ31gKTtcblxuICAgIGxldCBtb2RlbCA9ICh0aGlzIGFzIGFueSlbbmFtZV0gYXNcbiAgICAgIHwgUFxuICAgICAgfCBPRGF0YU1vZGVsPFA+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PlxuICAgICAgfCBudWxsO1xuICAgIGlmIChmaWVsZC5pc1N0cnVjdHVyZWRUeXBlKCkgJiYgbW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpZWxkLmNvbGxlY3Rpb24pIHtcbiAgICAgICAgbW9kZWwgPSBmaWVsZC5jb2xsZWN0aW9uRmFjdG9yeSh7IHBhcmVudDogdGhpcyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlZiA9IGZpZWxkLm5hdmlnYXRpb25cbiAgICAgICAgICA/ICh0aGlzLnJlZmVyZW5jZWQoZmllbGQpIGFzIFApXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIG1vZGVsID1cbiAgICAgICAgICByZWYgPT09IG51bGxcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiBmaWVsZC5tb2RlbEZhY3RvcnkoeyBwYXJlbnQ6IHRoaXMsIHZhbHVlOiByZWYgfSk7XG4gICAgICB9XG4gICAgICAodGhpcyBhcyBhbnkpW25hbWVdID0gbW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIHNldEF0dHJpYnV0ZTxOPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPE4+IHwgT0RhdGFDb2xsZWN0aW9uPE4sIE9EYXRhTW9kZWw8Tj4+IHwgbnVsbCxcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSAoXG4gICAgICB0aGlzLm5hdmlnYXRpb25Qcm9wZXJ0eTxOPihuYW1lKSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPE4+XG4gICAgKS5yZWZlcmVuY2UoKTtcblxuICAgIGNvbnN0IGV0YWcgPSB0aGlzLmFubm90cygpLmV0YWc7XG4gICAgbGV0IG9icyQgPSBORVZFUiBhcyBPYnNlcnZhYmxlPGFueT47XG4gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFNb2RlbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS5zZXQoXG4gICAgICAgIG1vZGVsLmFzRW50aXR5KChlKSA9PiBlLnJlc291cmNlKCkpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8Tj4sXG4gICAgICAgIHsgZXRhZywgLi4ub3B0aW9ucyB9LFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKSB7XG4gICAgICBvYnMkID0gZm9ya0pvaW4oXG4gICAgICAgIG1vZGVsXG4gICAgICAgICAgLm1vZGVscygpXG4gICAgICAgICAgLm1hcCgobSkgPT5cbiAgICAgICAgICAgIHJlZmVyZW5jZS5hZGQoXG4gICAgICAgICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUucmVzb3VyY2UoKSkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxOPixcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gbnVsbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS51bnNldCh7IGV0YWcsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsIChtb2RlbCkgPT4gdGhpcy5hc3NpZ24oeyBbbmFtZV06IG1vZGVsIH0pKTtcbiAgfVxuXG4gIHNldFJlZmVyZW5jZTxOPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIG1vZGVsOiBPRGF0YU1vZGVsPE4+IHwgT0RhdGFDb2xsZWN0aW9uPE4sIE9EYXRhTW9kZWw8Tj4+IHwgbnVsbCxcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSAoXG4gICAgICB0aGlzLm5hdmlnYXRpb25Qcm9wZXJ0eTxOPihuYW1lKSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPE4+XG4gICAgKS5yZWZlcmVuY2UoKTtcblxuICAgIGNvbnN0IGV0YWcgPSB0aGlzLmFubm90cygpLmV0YWc7XG4gICAgbGV0IG9icyQgPSBORVZFUiBhcyBPYnNlcnZhYmxlPGFueT47XG4gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFNb2RlbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS5zZXQoXG4gICAgICAgIG1vZGVsLmFzRW50aXR5KChlKSA9PiBlLnJlc291cmNlKCkpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8Tj4sXG4gICAgICAgIHsgZXRhZywgLi4ub3B0aW9ucyB9LFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKSB7XG4gICAgICBvYnMkID0gZm9ya0pvaW4oXG4gICAgICAgIG1vZGVsXG4gICAgICAgICAgLm1vZGVscygpXG4gICAgICAgICAgLm1hcCgobSkgPT5cbiAgICAgICAgICAgIHJlZmVyZW5jZS5hZGQoXG4gICAgICAgICAgICAgIG0uYXNFbnRpdHkoKGUpID0+IGUucmVzb3VyY2UoKSkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxOPixcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gbnVsbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS51bnNldCh7IGV0YWcsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQsIChtb2RlbCkgPT4gdGhpcy5hc3NpZ24oeyBbbmFtZV06IG1vZGVsIH0pKTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBNb2RlbCBJZGVudGl0eVxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdNb2RlbCc7XG4gIH1cbiAgZXF1YWxzKG90aGVyOiBPRGF0YU1vZGVsPFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMgPT09IG90aGVyKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIHRoaXMgIT09IHR5cGVvZiBvdGhlcikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9tZXRhO1xuICAgIGNvbnN0IHRoaXNDaWQgPSAoPGFueT50aGlzKVttZXRhLmNpZF07XG4gICAgY29uc3Qgb3RoZXJDaWQgPSAoPGFueT5vdGhlcilbbWV0YS5jaWRdO1xuICAgIGlmIChcbiAgICAgIHRoaXNDaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgb3RoZXJDaWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgVHlwZXMuaXNFcXVhbCh0aGlzQ2lkLCBvdGhlckNpZClcbiAgICApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAobWV0YS5pc0VudGl0eVR5cGUoKSkge1xuICAgICAgY29uc3QgdGhpc0tleSA9IHRoaXMua2V5KCk7XG4gICAgICBjb25zdCBvdGhlcktleSA9IG90aGVyLmtleSgpO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzS2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgb3RoZXJLZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBUeXBlcy5pc0VxdWFsKHRoaXNLZXksIG90aGVyS2V5KVxuICAgICAgKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG1ldGEuaXNDb21wbGV4VHlwZSgpKSB7XG4gICAgICBjb25zdCB0aGlzSnNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgICBjb25zdCBvdGhlckpzb24gPSBvdGhlci50b0pzb24oKTtcbiAgICAgIGlmIChUeXBlcy5pc0VxdWFsKHRoaXNKc29uLCBvdGhlckpzb24pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBDb2xsZWN0aW9uIFRvb2xzXG4gIGNvbGxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudCAhPT0gbnVsbCAmJlxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHRoaXMuX3BhcmVudFswXSlcbiAgICAgID8gKHRoaXMuX3BhcmVudFswXSBhcyBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5leHQoKTogT0RhdGFNb2RlbDxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbigpPy5uZXh0KHRoaXMpO1xuICB9XG5cbiAgcHJldigpOiBPRGF0YU1vZGVsPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0aW9uKCk/LnByZXYodGhpcyk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG59XG5cbmNvbnN0IFJFU0VSVkVEX0ZJRUxEX05BTUVTID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoT0RhdGFNb2RlbC5wcm90b3R5cGUpO1xuIl19
|