@vendasta/iam 2.2.2 → 2.3.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.
Files changed (119) hide show
  1. package/esm2020/lib/_generated/host.service.mjs +25 -0
  2. package/esm2020/lib/_generated/index.mjs +2 -0
  3. package/esm2020/lib/_internal/enums/api.enum.mjs +22 -0
  4. package/esm2020/lib/_internal/enums/index.mjs +12 -0
  5. package/esm2020/lib/_internal/enums/policies.enum.mjs +18 -0
  6. package/esm2020/lib/_internal/enums/resources.enum.mjs +14 -0
  7. package/esm2020/lib/_internal/enums/subjects.enum.mjs +17 -0
  8. package/esm2020/lib/_internal/enums/users.enum.mjs +13 -0
  9. package/esm2020/lib/_internal/iam.api.service.mjs +189 -0
  10. package/esm2020/lib/_internal/index.mjs +12 -0
  11. package/esm2020/lib/_internal/interfaces/annotations.interface.mjs +8 -0
  12. package/esm2020/lib/_internal/interfaces/api.interface.mjs +2 -0
  13. package/esm2020/lib/_internal/interfaces/attributes.interface.mjs +8 -0
  14. package/esm2020/lib/_internal/interfaces/field-mask.interface.mjs +8 -0
  15. package/esm2020/lib/_internal/interfaces/index.mjs +2 -0
  16. package/esm2020/lib/_internal/interfaces/policies.interface.mjs +3 -0
  17. package/esm2020/lib/_internal/interfaces/resources.interface.mjs +2 -0
  18. package/esm2020/lib/_internal/interfaces/security-logs.interface.mjs +8 -0
  19. package/esm2020/lib/_internal/interfaces/subjects.interface.mjs +2 -0
  20. package/esm2020/lib/_internal/interfaces/users.interface.mjs +2 -0
  21. package/esm2020/lib/_internal/objects/annotations.mjs +30 -0
  22. package/esm2020/lib/_internal/objects/api.mjs +1846 -0
  23. package/esm2020/lib/_internal/objects/attributes.mjs +158 -0
  24. package/esm2020/lib/_internal/objects/field-mask.mjs +27 -0
  25. package/esm2020/lib/_internal/objects/index.mjs +16 -0
  26. package/esm2020/lib/_internal/objects/policies.mjs +264 -0
  27. package/esm2020/lib/_internal/objects/resources.mjs +168 -0
  28. package/esm2020/lib/_internal/objects/security-logs.mjs +42 -0
  29. package/esm2020/lib/_internal/objects/subjects.mjs +352 -0
  30. package/esm2020/lib/_internal/objects/users.mjs +168 -0
  31. package/esm2020/lib/_internal/user-iam.api.service.mjs +65 -0
  32. package/esm2020/lib/http/http.interface.mjs +2 -0
  33. package/esm2020/lib/http/http.mjs +104 -0
  34. package/esm2020/lib/http/iam.http.api.service.mjs +67 -0
  35. package/esm2020/lib/iam.service.mjs +155 -0
  36. package/esm2020/lib/index.mjs +7 -0
  37. package/esm2020/lib/personas/account-group.mjs +9 -0
  38. package/esm2020/lib/personas/base-personas.mjs +93 -0
  39. package/esm2020/lib/personas/developer.mjs +9 -0
  40. package/esm2020/lib/personas/digital-agent.mjs +9 -0
  41. package/esm2020/lib/personas/index.mjs +12 -0
  42. package/esm2020/lib/personas/partner-app.mjs +9 -0
  43. package/esm2020/lib/personas/partner.mjs +25 -0
  44. package/esm2020/lib/personas/persona-type.enum.mjs +13 -0
  45. package/esm2020/lib/personas/personas.mjs +57 -0
  46. package/esm2020/lib/personas/salesperson.mjs +15 -0
  47. package/esm2020/lib/personas/smb.mjs +10 -0
  48. package/esm2020/lib/personas/success.mjs +9 -0
  49. package/esm2020/lib/personas/vendor.mjs +9 -0
  50. package/esm2020/public_api.mjs +2 -0
  51. package/esm2020/vendasta-iam.mjs +5 -0
  52. package/fesm2015/{vendasta-iam.js → vendasta-iam.mjs} +362 -386
  53. package/fesm2015/vendasta-iam.mjs.map +1 -0
  54. package/fesm2020/vendasta-iam.mjs +3937 -0
  55. package/fesm2020/vendasta-iam.mjs.map +1 -0
  56. package/lib/_generated/host.service.d.ts +4 -11
  57. package/lib/_internal/iam.api.service.d.ts +3 -2
  58. package/lib/_internal/user-iam.api.service.d.ts +3 -2
  59. package/lib/http/iam.http.api.service.d.ts +3 -2
  60. package/lib/iam.service.d.ts +2 -2
  61. package/package.json +27 -16
  62. package/{README.md → src/README.md} +0 -0
  63. package/CHANGELOG.md +0 -101
  64. package/bundles/vendasta-iam.umd.js +0 -4531
  65. package/bundles/vendasta-iam.umd.js.map +0 -1
  66. package/bundles/vendasta-iam.umd.min.js +0 -16
  67. package/bundles/vendasta-iam.umd.min.js.map +0 -1
  68. package/esm2015/lib/_generated/host.service.js +0 -64
  69. package/esm2015/lib/_generated/index.js +0 -2
  70. package/esm2015/lib/_internal/enums/api.enum.js +0 -22
  71. package/esm2015/lib/_internal/enums/index.js +0 -12
  72. package/esm2015/lib/_internal/enums/policies.enum.js +0 -18
  73. package/esm2015/lib/_internal/enums/resources.enum.js +0 -14
  74. package/esm2015/lib/_internal/enums/subjects.enum.js +0 -17
  75. package/esm2015/lib/_internal/enums/users.enum.js +0 -13
  76. package/esm2015/lib/_internal/iam.api.service.js +0 -188
  77. package/esm2015/lib/_internal/index.js +0 -12
  78. package/esm2015/lib/_internal/interfaces/annotations.interface.js +0 -8
  79. package/esm2015/lib/_internal/interfaces/api.interface.js +0 -2
  80. package/esm2015/lib/_internal/interfaces/attributes.interface.js +0 -8
  81. package/esm2015/lib/_internal/interfaces/field-mask.interface.js +0 -8
  82. package/esm2015/lib/_internal/interfaces/index.js +0 -2
  83. package/esm2015/lib/_internal/interfaces/policies.interface.js +0 -3
  84. package/esm2015/lib/_internal/interfaces/resources.interface.js +0 -2
  85. package/esm2015/lib/_internal/interfaces/security-logs.interface.js +0 -8
  86. package/esm2015/lib/_internal/interfaces/subjects.interface.js +0 -2
  87. package/esm2015/lib/_internal/interfaces/users.interface.js +0 -2
  88. package/esm2015/lib/_internal/objects/annotations.js +0 -30
  89. package/esm2015/lib/_internal/objects/api.js +0 -1846
  90. package/esm2015/lib/_internal/objects/attributes.js +0 -158
  91. package/esm2015/lib/_internal/objects/field-mask.js +0 -27
  92. package/esm2015/lib/_internal/objects/index.js +0 -16
  93. package/esm2015/lib/_internal/objects/policies.js +0 -264
  94. package/esm2015/lib/_internal/objects/resources.js +0 -168
  95. package/esm2015/lib/_internal/objects/security-logs.js +0 -42
  96. package/esm2015/lib/_internal/objects/subjects.js +0 -352
  97. package/esm2015/lib/_internal/objects/users.js +0 -168
  98. package/esm2015/lib/_internal/user-iam.api.service.js +0 -64
  99. package/esm2015/lib/http/http.interface.js +0 -2
  100. package/esm2015/lib/http/http.js +0 -102
  101. package/esm2015/lib/http/iam.http.api.service.js +0 -65
  102. package/esm2015/lib/iam.service.js +0 -152
  103. package/esm2015/lib/index.js +0 -7
  104. package/esm2015/lib/personas/account-group.js +0 -9
  105. package/esm2015/lib/personas/base-personas.js +0 -89
  106. package/esm2015/lib/personas/developer.js +0 -9
  107. package/esm2015/lib/personas/digital-agent.js +0 -9
  108. package/esm2015/lib/personas/index.js +0 -12
  109. package/esm2015/lib/personas/partner-app.js +0 -9
  110. package/esm2015/lib/personas/partner.js +0 -25
  111. package/esm2015/lib/personas/persona-type.enum.js +0 -13
  112. package/esm2015/lib/personas/personas.js +0 -57
  113. package/esm2015/lib/personas/salesperson.js +0 -15
  114. package/esm2015/lib/personas/smb.js +0 -10
  115. package/esm2015/lib/personas/success.js +0 -9
  116. package/esm2015/lib/personas/vendor.js +0 -9
  117. package/esm2015/public_api.js +0 -2
  118. package/esm2015/vendasta-iam.js +0 -5
  119. package/fesm2015/vendasta-iam.js.map +0 -1
@@ -1,168 +0,0 @@
1
- import { PolicyNode } from './policies';
2
- import * as e from '../enums';
3
- export function enumStringToValue(enumRef, value) {
4
- if (typeof value === 'number') {
5
- return value;
6
- }
7
- return enumRef[value];
8
- }
9
- export class AccessCheckFailures {
10
- constructor(kwargs) {
11
- if (!kwargs) {
12
- return;
13
- }
14
- Object.assign(this, kwargs);
15
- }
16
- static fromProto(proto) {
17
- let m = new AccessCheckFailures();
18
- m = Object.assign(m, proto);
19
- if (proto.failures) {
20
- m.failures = proto.failures.map(ResourceIdentifier.fromProto);
21
- }
22
- return m;
23
- }
24
- toApiJson() {
25
- const toReturn = {};
26
- if (typeof this.failures !== 'undefined' && this.failures !== null) {
27
- toReturn['failures'] = 'toApiJson' in this.failures ? this.failures.toApiJson() : this.failures;
28
- }
29
- return toReturn;
30
- }
31
- }
32
- export class ResourceIdentifierIdentifiersEntry {
33
- constructor(kwargs) {
34
- if (!kwargs) {
35
- return;
36
- }
37
- Object.assign(this, kwargs);
38
- }
39
- static fromProto(proto) {
40
- let m = new ResourceIdentifierIdentifiersEntry();
41
- m = Object.assign(m, proto);
42
- if (proto.value) {
43
- m.value = ValueList.fromProto(proto.value);
44
- }
45
- return m;
46
- }
47
- toApiJson() {
48
- const toReturn = {};
49
- if (typeof this.key !== 'undefined') {
50
- toReturn['key'] = this.key;
51
- }
52
- if (typeof this.value !== 'undefined' && this.value !== null) {
53
- toReturn['value'] = 'toApiJson' in this.value ? this.value.toApiJson() : this.value;
54
- }
55
- return toReturn;
56
- }
57
- }
58
- export class Policy {
59
- constructor(kwargs) {
60
- if (!kwargs) {
61
- return;
62
- }
63
- Object.assign(this, kwargs);
64
- }
65
- static fromProto(proto) {
66
- let m = new Policy();
67
- m = Object.assign(m, proto);
68
- if (proto.operations) {
69
- m.operations = proto.operations.map((v) => enumStringToValue(e.AccessScope, v));
70
- }
71
- if (proto.policy) {
72
- m.policy = PolicyNode.fromProto(proto.policy);
73
- }
74
- return m;
75
- }
76
- toApiJson() {
77
- const toReturn = {};
78
- if (typeof this.appId !== 'undefined') {
79
- toReturn['appId'] = this.appId;
80
- }
81
- if (typeof this.resourceId !== 'undefined') {
82
- toReturn['resourceId'] = this.resourceId;
83
- }
84
- if (typeof this.policyId !== 'undefined') {
85
- toReturn['policyId'] = this.policyId;
86
- }
87
- if (typeof this.policyName !== 'undefined') {
88
- toReturn['policyName'] = this.policyName;
89
- }
90
- if (typeof this.operations !== 'undefined') {
91
- toReturn['operations'] = this.operations;
92
- }
93
- if (typeof this.actions !== 'undefined') {
94
- toReturn['actions'] = this.actions;
95
- }
96
- if (typeof this.policy !== 'undefined' && this.policy !== null) {
97
- toReturn['policy'] = 'toApiJson' in this.policy ? this.policy.toApiJson() : this.policy;
98
- }
99
- return toReturn;
100
- }
101
- }
102
- export class ResourceIdentifier {
103
- constructor(kwargs) {
104
- if (!kwargs) {
105
- return;
106
- }
107
- Object.assign(this, kwargs);
108
- }
109
- static fromProto(proto) {
110
- let m = new ResourceIdentifier();
111
- m = Object.assign(m, proto);
112
- if (proto.identifiers) {
113
- m.identifiers = Object.keys(proto.identifiers).reduce((obj, k) => { obj[k] = ValueList.fromProto(proto.identifiers[k]); return obj; }, {});
114
- }
115
- return m;
116
- }
117
- toApiJson() {
118
- const toReturn = {};
119
- if (typeof this.identifiers !== 'undefined' && this.identifiers !== null) {
120
- toReturn['identifiers'] = 'toApiJson' in this.identifiers ? this.identifiers.toApiJson() : this.identifiers;
121
- }
122
- return toReturn;
123
- }
124
- }
125
- export class ResourceOwner {
126
- constructor(kwargs) {
127
- if (!kwargs) {
128
- return;
129
- }
130
- Object.assign(this, kwargs);
131
- }
132
- static fromProto(proto) {
133
- let m = new ResourceOwner();
134
- m = Object.assign(m, proto);
135
- return m;
136
- }
137
- toApiJson() {
138
- const toReturn = {};
139
- if (typeof this.appId !== 'undefined') {
140
- toReturn['appId'] = this.appId;
141
- }
142
- if (typeof this.appName !== 'undefined') {
143
- toReturn['appName'] = this.appName;
144
- }
145
- return toReturn;
146
- }
147
- }
148
- export class ValueList {
149
- constructor(kwargs) {
150
- if (!kwargs) {
151
- return;
152
- }
153
- Object.assign(this, kwargs);
154
- }
155
- static fromProto(proto) {
156
- let m = new ValueList();
157
- m = Object.assign(m, proto);
158
- return m;
159
- }
160
- toApiJson() {
161
- const toReturn = {};
162
- if (typeof this.values !== 'undefined') {
163
- toReturn['values'] = this.values;
164
- }
165
- return toReturn;
166
- }
167
- }
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2VzLmpzIiwic291cmNlUm9vdCI6Ii93b3Jrc3BhY2Uvc2Rrcy90eXBlc2NyaXB0L3NyYy9pYW1fc2RrL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9faW50ZXJuYWwvb2JqZWN0cy9yZXNvdXJjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEtBQUssQ0FBQyxNQUFNLFVBQVUsQ0FBQztBQUU5QixNQUFNLFVBQVUsaUJBQWlCLENBQUksT0FBWSxFQUFFLEtBQWE7SUFDOUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDN0IsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLE9BQU8sbUJBQW1CO0lBVTVCLFlBQVksTUFBdUM7UUFDL0MsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE9BQU87U0FDVjtRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFaRCxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQVU7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ2xDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQUM7UUFDcEYsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0lBU0QsU0FBUztRQUNMLE1BQU0sUUFBUSxHQUVWLEVBQUUsQ0FBQztRQUVQLElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFdBQVcsSUFB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Z2VuZXJhdGVkIGJ5IHNka2dlblxuLy8gRE8gTk9UIEVESVQhLlxuLy9cbi8vIE9iamVjdHMuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbmltcG9ydCAqIGFzIGkgZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBQb2xpY3lOb2RlIH0gZnJvbSAnLi9wb2xpY2llcyc7XG5pbXBvcnQgKiBhcyBlIGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVudW1TdHJpbmdUb1ZhbHVlPEU+KGVudW1SZWY6IGFueSwgdmFsdWU6IHN0cmluZyk6IEUge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZW51bVJlZlt2YWx1ZV07XG59XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NDaGVja0ZhaWx1cmVzIGltcGxlbWVudHMgaS5BY2Nlc3NDaGVja0ZhaWx1cmVzSW50ZXJmYWNlIHtcbiAgICBmYWlsdXJlczogUmVzb3VyY2VJZGVudGlmaWVyW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBBY2Nlc3NDaGVja0ZhaWx1cmVzIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgQWNjZXNzQ2hlY2tGYWlsdXJlcygpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5mYWlsdXJlcykge20uZmFpbHVyZXMgPSBwcm90by5mYWlsdXJlcy5tYXAoUmVzb3VyY2VJZGVudGlmaWVyLmZyb21Qcm90byk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkFjY2Vzc0NoZWNrRmFpbHVyZXNJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5mYWlsdXJlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5mYWlsdXJlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydmYWlsdXJlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5mYWlsdXJlcyA/ICh0aGlzLmZhaWx1cmVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmZhaWx1cmVzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlc291cmNlSWRlbnRpZmllcklkZW50aWZpZXJzRW50cnkgaW1wbGVtZW50cyBpLlJlc291cmNlSWRlbnRpZmllcklkZW50aWZpZXJzRW50cnlJbnRlcmZhY2Uge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBWYWx1ZUxpc3Q7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBSZXNvdXJjZUlkZW50aWZpZXJJZGVudGlmaWVyc0VudHJ5IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgUmVzb3VyY2VJZGVudGlmaWVySWRlbnRpZmllcnNFbnRyeSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by52YWx1ZSkge20udmFsdWUgPSBWYWx1ZUxpc3QuZnJvbVByb3RvKHByb3RvLnZhbHVlKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuUmVzb3VyY2VJZGVudGlmaWVySWRlbnRpZmllcnNFbnRyeUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmtleSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsna2V5J10gPSB0aGlzLmtleTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy52YWx1ZSAhPT0gbnVsbCkge3RvUmV0dXJuWyd2YWx1ZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy52YWx1ZSA/ICh0aGlzLnZhbHVlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnZhbHVlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBvbGljeSBpbXBsZW1lbnRzIGkuUG9saWN5SW50ZXJmYWNlIHtcbiAgICBhcHBJZDogc3RyaW5nO1xuICAgIHJlc291cmNlSWQ6IHN0cmluZztcbiAgICBwb2xpY3lJZDogc3RyaW5nO1xuICAgIHBvbGljeU5hbWU6IHN0cmluZztcbiAgICBvcGVyYXRpb25zOiBlLkFjY2Vzc1Njb3BlW107XG4gICAgYWN0aW9uczogc3RyaW5nW107XG4gICAgcG9saWN5OiBQb2xpY3lOb2RlO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogUG9saWN5IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgUG9saWN5KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLm9wZXJhdGlvbnMpIHttLm9wZXJhdGlvbnMgPSBwcm90by5vcGVyYXRpb25zLm1hcCgodjogc3RyaW5nKSA9PiBlbnVtU3RyaW5nVG9WYWx1ZTxlLkFjY2Vzc1Njb3BlPihlLkFjY2Vzc1Njb3BlLCB2KSk7fVxuICAgICAgICBpZiAocHJvdG8ucG9saWN5KSB7bS5wb2xpY3kgPSBQb2xpY3lOb2RlLmZyb21Qcm90byhwcm90by5wb2xpY3kpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5Qb2xpY3lJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hcHBJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnYXBwSWQnXSA9IHRoaXMuYXBwSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucmVzb3VyY2VJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsncmVzb3VyY2VJZCddID0gdGhpcy5yZXNvdXJjZUlkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBvbGljeUlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydwb2xpY3lJZCddID0gdGhpcy5wb2xpY3lJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wb2xpY3lOYW1lICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydwb2xpY3lOYW1lJ10gPSB0aGlzLnBvbGljeU5hbWU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3BlcmF0aW9ucyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnb3BlcmF0aW9ucyddID0gdGhpcy5vcGVyYXRpb25zO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFjdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2FjdGlvbnMnXSA9IHRoaXMuYWN0aW9uczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wb2xpY3kgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucG9saWN5ICE9PSBudWxsKSB7dG9SZXR1cm5bJ3BvbGljeSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5wb2xpY3kgPyAodGhpcy5wb2xpY3kgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucG9saWN5O31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlc291cmNlSWRlbnRpZmllciBpbXBsZW1lbnRzIGkuUmVzb3VyY2VJZGVudGlmaWVySW50ZXJmYWNlIHtcbiAgICBpZGVudGlmaWVyczoge1trZXk6IHN0cmluZ106IFZhbHVlTGlzdH07XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBSZXNvdXJjZUlkZW50aWZpZXIge1xuICAgICAgICBsZXQgbSA9IG5ldyBSZXNvdXJjZUlkZW50aWZpZXIoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uaWRlbnRpZmllcnMpIHttLmlkZW50aWZpZXJzID0gT2JqZWN0LmtleXMocHJvdG8uaWRlbnRpZmllcnMpLnJlZHVjZTxhbnk+KChvYmosIGspID0+IHsgb2JqW2tdID0gVmFsdWVMaXN0LmZyb21Qcm90byhwcm90by5pZGVudGlmaWVyc1trXSk7IHJldHVybiBvYmo7IH0sIHt9KTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuUmVzb3VyY2VJZGVudGlmaWVySW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaWRlbnRpZmllcnMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuaWRlbnRpZmllcnMgIT09IG51bGwpIHt0b1JldHVyblsnaWRlbnRpZmllcnMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuaWRlbnRpZmllcnMgPyAodGhpcy5pZGVudGlmaWVycyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5pZGVudGlmaWVyczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZU93bmVyIGltcGxlbWVudHMgaS5SZXNvdXJjZU93bmVySW50ZXJmYWNlIHtcbiAgICBhcHBJZDogc3RyaW5nO1xuICAgIGFwcE5hbWU6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFJlc291cmNlT3duZXIge1xuICAgICAgICBsZXQgbSA9IG5ldyBSZXNvdXJjZU93bmVyKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5SZXNvdXJjZU93bmVySW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYXBwSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2FwcElkJ10gPSB0aGlzLmFwcElkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFwcE5hbWUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2FwcE5hbWUnXSA9IHRoaXMuYXBwTmFtZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWYWx1ZUxpc3QgaW1wbGVtZW50cyBpLlZhbHVlTGlzdEludGVyZmFjZSB7XG4gICAgdmFsdWVzOiBzdHJpbmdbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFZhbHVlTGlzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IFZhbHVlTGlzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuVmFsdWVMaXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWVzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd2YWx1ZXMnXSA9IHRoaXMudmFsdWVzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuIl19
@@ -1,42 +0,0 @@
1
- export function enumStringToValue(enumRef, value) {
2
- if (typeof value === 'number') {
3
- return value;
4
- }
5
- return enumRef[value];
6
- }
7
- export class SecurityLog {
8
- constructor(kwargs) {
9
- if (!kwargs) {
10
- return;
11
- }
12
- Object.assign(this, kwargs);
13
- }
14
- static fromProto(proto) {
15
- let m = new SecurityLog();
16
- m = Object.assign(m, proto);
17
- if (proto.created) {
18
- m.created = new Date(proto.created);
19
- }
20
- return m;
21
- }
22
- toApiJson() {
23
- const toReturn = {};
24
- if (typeof this.userId !== 'undefined') {
25
- toReturn['userId'] = this.userId;
26
- }
27
- if (typeof this.actionId !== 'undefined') {
28
- toReturn['actionId'] = this.actionId;
29
- }
30
- if (typeof this.logId !== 'undefined') {
31
- toReturn['logId'] = this.logId;
32
- }
33
- if (typeof this.description !== 'undefined') {
34
- toReturn['description'] = this.description;
35
- }
36
- if (typeof this.created !== 'undefined' && this.created !== null) {
37
- toReturn['created'] = 'toApiJson' in this.created ? this.created.toApiJson() : this.created;
38
- }
39
- return toReturn;
40
- }
41
- }
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktbG9ncy5qcyIsInNvdXJjZVJvb3QiOiIvd29ya3NwYWNlL3Nka3MvdHlwZXNjcmlwdC9zcmMvaWFtX3Nkay9zcmMvIiwic291cmNlcyI6WyJsaWIvX2ludGVybmFsL29iamVjdHMvc2VjdXJpdHktbG9ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxNQUFNLFVBQVUsaUJBQWlCLENBQUksT0FBWSxFQUFFLEtBQWE7SUFDOUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDN0IsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLE9BQU8sV0FBVztJQWNwQixZQUFZLE1BQStCO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDVCxPQUFPO1NBQ1Y7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBWkQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFVO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDMUIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVCLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQUM7UUFDekQsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0lBU0QsU0FBUztRQUNMLE1BQU0sUUFBUSxHQUVWLEVBQUUsQ0FBQztRQUVQLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBRTtZQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQUM7UUFDM0UsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssV0FBVyxFQUFFO1lBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7U0FBQztRQUNqRixJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLEVBQUU7WUFBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUFDO1FBQ3hFLElBQUksT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRTtZQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQUM7UUFDMUYsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsT0FBZSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQUM7UUFDekssT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyBDb2RlIGdlbmVyYXRlZCBieSBzZGtnZW5cbi8vIERPIE5PVCBFRElUIS5cbi8vXG4vLyBPYmplY3RzLlxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5pbXBvcnQgKiBhcyBpIGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG5pbXBvcnQgKiBhcyBlIGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVudW1TdHJpbmdUb1ZhbHVlPEU+KGVudW1SZWY6IGFueSwgdmFsdWU6IHN0cmluZyk6IEUge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZW51bVJlZlt2YWx1ZV07XG59XG5cbmV4cG9ydCBjbGFzcyBTZWN1cml0eUxvZyBpbXBsZW1lbnRzIGkuU2VjdXJpdHlMb2dJbnRlcmZhY2Uge1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIGFjdGlvbklkOiBzdHJpbmc7XG4gICAgbG9nSWQ6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNyZWF0ZWQ6IERhdGU7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBTZWN1cml0eUxvZyB7XG4gICAgICAgIGxldCBtID0gbmV3IFNlY3VyaXR5TG9nKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmNyZWF0ZWQpIHttLmNyZWF0ZWQgPSBuZXcgRGF0ZShwcm90by5jcmVhdGVkKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuU2VjdXJpdHlMb2dJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy51c2VySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3VzZXJJZCddID0gdGhpcy51c2VySWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYWN0aW9uSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2FjdGlvbklkJ10gPSB0aGlzLmFjdGlvbklkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxvZ0lkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydsb2dJZCddID0gdGhpcy5sb2dJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kZXNjcmlwdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnZGVzY3JpcHRpb24nXSA9IHRoaXMuZGVzY3JpcHRpb247fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY3JlYXRlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5jcmVhdGVkICE9PSBudWxsKSB7dG9SZXR1cm5bJ2NyZWF0ZWQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuY3JlYXRlZCA/ICh0aGlzLmNyZWF0ZWQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuY3JlYXRlZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbiJdfQ==
@@ -1,352 +0,0 @@
1
- import { StructAttribute } from './attributes';
2
- import * as e from '../enums';
3
- export function enumStringToValue(enumRef, value) {
4
- if (typeof value === 'number') {
5
- return value;
6
- }
7
- return enumRef[value];
8
- }
9
- export class Context {
10
- constructor(kwargs) {
11
- if (!kwargs) {
12
- return;
13
- }
14
- Object.assign(this, kwargs);
15
- }
16
- static fromProto(proto) {
17
- let m = new Context();
18
- m = Object.assign(m, proto);
19
- if (proto.namespaced) {
20
- m.namespaced = NamespacedContext.fromProto(proto.namespaced);
21
- }
22
- if (proto.typed) {
23
- m.typed = TypedContext.fromProto(proto.typed);
24
- }
25
- return m;
26
- }
27
- toApiJson() {
28
- const toReturn = {};
29
- if (typeof this.namespaced !== 'undefined' && this.namespaced !== null) {
30
- toReturn['namespaced'] = 'toApiJson' in this.namespaced ? this.namespaced.toApiJson() : this.namespaced;
31
- }
32
- if (typeof this.typed !== 'undefined' && this.typed !== null) {
33
- toReturn['typed'] = 'toApiJson' in this.typed ? this.typed.toApiJson() : this.typed;
34
- }
35
- return toReturn;
36
- }
37
- }
38
- export class MultiValueAttribute {
39
- constructor(kwargs) {
40
- if (!kwargs) {
41
- return;
42
- }
43
- Object.assign(this, kwargs);
44
- }
45
- static fromProto(proto) {
46
- let m = new MultiValueAttribute();
47
- m = Object.assign(m, proto);
48
- return m;
49
- }
50
- toApiJson() {
51
- const toReturn = {};
52
- if (typeof this.key !== 'undefined') {
53
- toReturn['key'] = this.key;
54
- }
55
- if (typeof this.values !== 'undefined') {
56
- toReturn['values'] = this.values;
57
- }
58
- return toReturn;
59
- }
60
- }
61
- export class Mutation {
62
- constructor(kwargs) {
63
- if (!kwargs) {
64
- return;
65
- }
66
- Object.assign(this, kwargs);
67
- }
68
- static fromProto(proto) {
69
- let m = new Mutation();
70
- m = Object.assign(m, proto);
71
- if (proto.add) {
72
- m.add = SingleValueAttribute.fromProto(proto.add);
73
- }
74
- if (proto.replace) {
75
- m.replace = MultiValueAttribute.fromProto(proto.replace);
76
- }
77
- if (proto.remove) {
78
- m.remove = SingleValueAttribute.fromProto(proto.remove);
79
- }
80
- if (proto.replaceAttributes) {
81
- m.replaceAttributes = StructAttribute.fromProto(proto.replaceAttributes);
82
- }
83
- if (proto.addAttributes) {
84
- m.addAttributes = StructAttribute.fromProto(proto.addAttributes);
85
- }
86
- if (proto.removeAttributes) {
87
- m.removeAttributes = StructAttribute.fromProto(proto.removeAttributes);
88
- }
89
- return m;
90
- }
91
- toApiJson() {
92
- const toReturn = {};
93
- if (typeof this.add !== 'undefined' && this.add !== null) {
94
- toReturn['add'] = 'toApiJson' in this.add ? this.add.toApiJson() : this.add;
95
- }
96
- if (typeof this.replace !== 'undefined' && this.replace !== null) {
97
- toReturn['replace'] = 'toApiJson' in this.replace ? this.replace.toApiJson() : this.replace;
98
- }
99
- if (typeof this.remove !== 'undefined' && this.remove !== null) {
100
- toReturn['remove'] = 'toApiJson' in this.remove ? this.remove.toApiJson() : this.remove;
101
- }
102
- if (typeof this.dropKey !== 'undefined') {
103
- toReturn['dropKey'] = this.dropKey;
104
- }
105
- if (typeof this.replaceAttributes !== 'undefined' && this.replaceAttributes !== null) {
106
- toReturn['replaceAttributes'] = 'toApiJson' in this.replaceAttributes ? this.replaceAttributes.toApiJson() : this.replaceAttributes;
107
- }
108
- if (typeof this.addAttributes !== 'undefined' && this.addAttributes !== null) {
109
- toReturn['addAttributes'] = 'toApiJson' in this.addAttributes ? this.addAttributes.toApiJson() : this.addAttributes;
110
- }
111
- if (typeof this.removeAttributes !== 'undefined' && this.removeAttributes !== null) {
112
- toReturn['removeAttributes'] = 'toApiJson' in this.removeAttributes ? this.removeAttributes.toApiJson() : this.removeAttributes;
113
- }
114
- return toReturn;
115
- }
116
- }
117
- export class NamespacedContext {
118
- constructor(kwargs) {
119
- if (!kwargs) {
120
- return;
121
- }
122
- Object.assign(this, kwargs);
123
- }
124
- static fromProto(proto) {
125
- let m = new NamespacedContext();
126
- m = Object.assign(m, proto);
127
- return m;
128
- }
129
- toApiJson() {
130
- const toReturn = {};
131
- if (typeof this.namespace !== 'undefined') {
132
- toReturn['namespace'] = this.namespace;
133
- }
134
- if (typeof this.type !== 'undefined') {
135
- toReturn['type'] = this.type;
136
- }
137
- return toReturn;
138
- }
139
- }
140
- export class Persona {
141
- constructor(kwargs) {
142
- if (!kwargs) {
143
- return;
144
- }
145
- Object.assign(this, kwargs);
146
- }
147
- static fromProto(proto) {
148
- let m = new Persona();
149
- m = Object.assign(m, proto);
150
- if (proto.subject) {
151
- m.subject = Subject.fromProto(proto.subject);
152
- }
153
- if (proto.context) {
154
- m.context = Context.fromProto(proto.context);
155
- }
156
- return m;
157
- }
158
- toApiJson() {
159
- const toReturn = {};
160
- if (typeof this.subject !== 'undefined' && this.subject !== null) {
161
- toReturn['subject'] = 'toApiJson' in this.subject ? this.subject.toApiJson() : this.subject;
162
- }
163
- if (typeof this.context !== 'undefined' && this.context !== null) {
164
- toReturn['context'] = 'toApiJson' in this.context ? this.context.toApiJson() : this.context;
165
- }
166
- return toReturn;
167
- }
168
- }
169
- export class PublicKey {
170
- constructor(kwargs) {
171
- if (!kwargs) {
172
- return;
173
- }
174
- Object.assign(this, kwargs);
175
- }
176
- static fromProto(proto) {
177
- let m = new PublicKey();
178
- m = Object.assign(m, proto);
179
- if (proto.algorithmType) {
180
- m.algorithmType = enumStringToValue(e.AlgorithmType, proto.algorithmType);
181
- }
182
- return m;
183
- }
184
- toApiJson() {
185
- const toReturn = {};
186
- if (typeof this.key !== 'undefined') {
187
- toReturn['key'] = this.key;
188
- }
189
- if (typeof this.id !== 'undefined') {
190
- toReturn['id'] = this.id;
191
- }
192
- if (typeof this.algorithmType !== 'undefined') {
193
- toReturn['algorithmType'] = this.algorithmType;
194
- }
195
- return toReturn;
196
- }
197
- }
198
- export class Query {
199
- constructor(kwargs) {
200
- if (!kwargs) {
201
- return;
202
- }
203
- Object.assign(this, kwargs);
204
- }
205
- static fromProto(proto) {
206
- let m = new Query();
207
- m = Object.assign(m, proto);
208
- return m;
209
- }
210
- toApiJson() {
211
- const toReturn = {};
212
- if (typeof this.searchTerm !== 'undefined') {
213
- toReturn['searchTerm'] = this.searchTerm;
214
- }
215
- if (typeof this.attributeKeys !== 'undefined') {
216
- toReturn['attributeKeys'] = this.attributeKeys;
217
- }
218
- return toReturn;
219
- }
220
- }
221
- export class SingleValueAttribute {
222
- constructor(kwargs) {
223
- if (!kwargs) {
224
- return;
225
- }
226
- Object.assign(this, kwargs);
227
- }
228
- static fromProto(proto) {
229
- let m = new SingleValueAttribute();
230
- m = Object.assign(m, proto);
231
- return m;
232
- }
233
- toApiJson() {
234
- const toReturn = {};
235
- if (typeof this.key !== 'undefined') {
236
- toReturn['key'] = this.key;
237
- }
238
- if (typeof this.value !== 'undefined') {
239
- toReturn['value'] = this.value;
240
- }
241
- return toReturn;
242
- }
243
- }
244
- export class Subject {
245
- constructor(kwargs) {
246
- if (!kwargs) {
247
- return;
248
- }
249
- Object.assign(this, kwargs);
250
- }
251
- static fromProto(proto) {
252
- let m = new Subject();
253
- m = Object.assign(m, proto);
254
- if (proto.attributes) {
255
- m.attributes = proto.attributes.map(MultiValueAttribute.fromProto);
256
- }
257
- if (proto.created) {
258
- m.created = new Date(proto.created);
259
- }
260
- if (proto.updated) {
261
- m.updated = new Date(proto.updated);
262
- }
263
- if (proto.lastLogin) {
264
- m.lastLogin = new Date(proto.lastLogin);
265
- }
266
- if (proto.publicKeys) {
267
- m.publicKeys = proto.publicKeys.map(PublicKey.fromProto);
268
- }
269
- if (proto.structAttributes) {
270
- m.structAttributes = StructAttribute.fromProto(proto.structAttributes);
271
- }
272
- return m;
273
- }
274
- toApiJson() {
275
- const toReturn = {};
276
- if (typeof this.subjectId !== 'undefined') {
277
- toReturn['subjectId'] = this.subjectId;
278
- }
279
- if (typeof this.email !== 'undefined') {
280
- toReturn['email'] = this.email;
281
- }
282
- if (typeof this.userId !== 'undefined') {
283
- toReturn['userId'] = this.userId;
284
- }
285
- if (typeof this.partnerId !== 'undefined') {
286
- toReturn['partnerId'] = this.partnerId;
287
- }
288
- if (typeof this.attributes !== 'undefined' && this.attributes !== null) {
289
- toReturn['attributes'] = 'toApiJson' in this.attributes ? this.attributes.toApiJson() : this.attributes;
290
- }
291
- if (typeof this.created !== 'undefined' && this.created !== null) {
292
- toReturn['created'] = 'toApiJson' in this.created ? this.created.toApiJson() : this.created;
293
- }
294
- if (typeof this.updated !== 'undefined' && this.updated !== null) {
295
- toReturn['updated'] = 'toApiJson' in this.updated ? this.updated.toApiJson() : this.updated;
296
- }
297
- if (typeof this.lastLogin !== 'undefined' && this.lastLogin !== null) {
298
- toReturn['lastLogin'] = 'toApiJson' in this.lastLogin ? this.lastLogin.toApiJson() : this.lastLogin;
299
- }
300
- if (typeof this.publicKeys !== 'undefined' && this.publicKeys !== null) {
301
- toReturn['publicKeys'] = 'toApiJson' in this.publicKeys ? this.publicKeys.toApiJson() : this.publicKeys;
302
- }
303
- if (typeof this.structAttributes !== 'undefined' && this.structAttributes !== null) {
304
- toReturn['structAttributes'] = 'toApiJson' in this.structAttributes ? this.structAttributes.toApiJson() : this.structAttributes;
305
- }
306
- return toReturn;
307
- }
308
- }
309
- export class SubjectResult {
310
- constructor(kwargs) {
311
- if (!kwargs) {
312
- return;
313
- }
314
- Object.assign(this, kwargs);
315
- }
316
- static fromProto(proto) {
317
- let m = new SubjectResult();
318
- m = Object.assign(m, proto);
319
- if (proto.subject) {
320
- m.subject = Subject.fromProto(proto.subject);
321
- }
322
- return m;
323
- }
324
- toApiJson() {
325
- const toReturn = {};
326
- if (typeof this.subject !== 'undefined' && this.subject !== null) {
327
- toReturn['subject'] = 'toApiJson' in this.subject ? this.subject.toApiJson() : this.subject;
328
- }
329
- return toReturn;
330
- }
331
- }
332
- export class TypedContext {
333
- constructor(kwargs) {
334
- if (!kwargs) {
335
- return;
336
- }
337
- Object.assign(this, kwargs);
338
- }
339
- static fromProto(proto) {
340
- let m = new TypedContext();
341
- m = Object.assign(m, proto);
342
- return m;
343
- }
344
- toApiJson() {
345
- const toReturn = {};
346
- if (typeof this.type !== 'undefined') {
347
- toReturn['type'] = this.type;
348
- }
349
- return toReturn;
350
- }
351
- }
352
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViamVjdHMuanMiLCJzb3VyY2VSb290IjoiL3dvcmtzcGFjZS9zZGtzL3R5cGVzY3JpcHQvc3JjL2lhbV9zZGsvc3JjLyIsInNvdXJjZXMiOlsibGliL19pbnRlcm5hbC9vYmplY3RzL3N1YmplY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxLQUFLLENBQUMsTUFBTSxVQUFVLENBQUM7QUFFOUIsTUFBTSxVQUFVLGlCQUFpQixDQUFJLE9BQVksRUFBRSxLQUFhO0lBQzlELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzdCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxPQUFPLE9BQU87SUFZaEIsWUFBWSxNQUEyQjtRQUNuQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTztTQUNWO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQWJELE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBVTtRQUN2QixJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3RCLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUU7WUFBQyxDQUFDLENBQUMsVUFBVSxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7U0FBQztRQUNyRixJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7WUFBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQUM7UUFDakUsT0FBTyxDQUFDLENBQUM7SUFD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Q0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQVNELFNBQVM7UUFDTCxNQUFNLFFBQVEsR0FFVixFQUFFLENBQUM7UUFFUCxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7WUFBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUFDO1FBQ3JFLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gQ29kZSBnZW5lcmF0ZWQgYnkgc2RrZ2VuXG4vLyBETyBOT1QgRURJVCEuXG4vL1xuLy8gT2JqZWN0cy5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuaW1wb3J0ICogYXMgaSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFN0cnVjdEF0dHJpYnV0ZSB9IGZyb20gJy4vYXR0cmlidXRlcyc7XG5pbXBvcnQgKiBhcyBlIGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVudW1TdHJpbmdUb1ZhbHVlPEU+KGVudW1SZWY6IGFueSwgdmFsdWU6IHN0cmluZyk6IEUge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZW51bVJlZlt2YWx1ZV07XG59XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0IGltcGxlbWVudHMgaS5Db250ZXh0SW50ZXJmYWNlIHtcbiAgICBuYW1lc3BhY2VkOiBOYW1lc3BhY2VkQ29udGV4dDtcbiAgICB0eXBlZDogVHlwZWRDb250ZXh0O1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ29udGV4dCB7XG4gICAgICAgIGxldCBtID0gbmV3IENvbnRleHQoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8ubmFtZXNwYWNlZCkge20ubmFtZXNwYWNlZCA9IE5hbWVzcGFjZWRDb250ZXh0LmZyb21Qcm90byhwcm90by5uYW1lc3BhY2VkKTt9XG4gICAgICAgIGlmIChwcm90by50eXBlZCkge20udHlwZWQgPSBUeXBlZENvbnRleHQuZnJvbVByb3RvKHByb3RvLnR5cGVkKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ29udGV4dEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm5hbWVzcGFjZWQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubmFtZXNwYWNlZCAhPT0gbnVsbCkge3RvUmV0dXJuWyduYW1lc3BhY2VkJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLm5hbWVzcGFjZWQgPyAodGhpcy5uYW1lc3BhY2VkIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm5hbWVzcGFjZWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHlwZWQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudHlwZWQgIT09IG51bGwpIHt0b1JldHVyblsndHlwZWQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMudHlwZWQgPyAodGhpcy50eXBlZCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy50eXBlZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNdWx0aVZhbHVlQXR0cmlidXRlIGltcGxlbWVudHMgaS5NdWx0aVZhbHVlQXR0cmlidXRlSW50ZXJmYWNlIHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB2YWx1ZXM6IHN0cmluZ1tdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTXVsdGlWYWx1ZUF0dHJpYnV0ZSB7XG4gICAgICAgIGxldCBtID0gbmV3IE11bHRpVmFsdWVBdHRyaWJ1dGUoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLk11bHRpVmFsdWVBdHRyaWJ1dGVJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5rZXkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2tleSddID0gdGhpcy5rZXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWVzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd2YWx1ZXMnXSA9IHRoaXMudmFsdWVzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE11dGF0aW9uIGltcGxlbWVudHMgaS5NdXRhdGlvbkludGVyZmFjZSB7XG4gICAgYWRkOiBTaW5nbGVWYWx1ZUF0dHJpYnV0ZTtcbiAgICByZXBsYWNlOiBNdWx0aVZhbHVlQXR0cmlidXRlO1xuICAgIHJlbW92ZTogU2luZ2xlVmFsdWVBdHRyaWJ1dGU7XG4gICAgZHJvcEtleTogc3RyaW5nO1xuICAgIHJlcGxhY2VBdHRyaWJ1dGVzOiBTdHJ1Y3RBdHRyaWJ1dGU7XG4gICAgYWRkQXR0cmlidXRlczogU3RydWN0QXR0cmlidXRlO1xuICAgIHJlbW92ZUF0dHJpYnV0ZXM6IFN0cnVjdEF0dHJpYnV0ZTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IE11dGF0aW9uIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTXV0YXRpb24oKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uYWRkKSB7bS5hZGQgPSBTaW5nbGVWYWx1ZUF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8uYWRkKTt9XG4gICAgICAgIGlmIChwcm90by5yZXBsYWNlKSB7bS5yZXBsYWNlID0gTXVsdGlWYWx1ZUF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8ucmVwbGFjZSk7fVxuICAgICAgICBpZiAocHJvdG8ucmVtb3ZlKSB7bS5yZW1vdmUgPSBTaW5nbGVWYWx1ZUF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8ucmVtb3ZlKTt9XG4gICAgICAgIGlmIChwcm90by5yZXBsYWNlQXR0cmlidXRlcykge20ucmVwbGFjZUF0dHJpYnV0ZXMgPSBTdHJ1Y3RBdHRyaWJ1dGUuZnJvbVByb3RvKHByb3RvLnJlcGxhY2VBdHRyaWJ1dGVzKTt9XG4gICAgICAgIGlmIChwcm90by5hZGRBdHRyaWJ1dGVzKSB7bS5hZGRBdHRyaWJ1dGVzID0gU3RydWN0QXR0cmlidXRlLmZyb21Qcm90byhwcm90by5hZGRBdHRyaWJ1dGVzKTt9XG4gICAgICAgIGlmIChwcm90by5yZW1vdmVBdHRyaWJ1dGVzKSB7bS5yZW1vdmVBdHRyaWJ1dGVzID0gU3RydWN0QXR0cmlidXRlLmZyb21Qcm90byhwcm90by5yZW1vdmVBdHRyaWJ1dGVzKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTXV0YXRpb25JbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hZGQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuYWRkICE9PSBudWxsKSB7dG9SZXR1cm5bJ2FkZCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5hZGQgPyAodGhpcy5hZGQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuYWRkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlcGxhY2UgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucmVwbGFjZSAhPT0gbnVsbCkge3RvUmV0dXJuWydyZXBsYWNlJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnJlcGxhY2UgPyAodGhpcy5yZXBsYWNlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnJlcGxhY2U7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucmVtb3ZlICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnJlbW92ZSAhPT0gbnVsbCkge3RvUmV0dXJuWydyZW1vdmUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucmVtb3ZlID8gKHRoaXMucmVtb3ZlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnJlbW92ZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kcm9wS2V5ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydkcm9wS2V5J10gPSB0aGlzLmRyb3BLZXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucmVwbGFjZUF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucmVwbGFjZUF0dHJpYnV0ZXMgIT09IG51bGwpIHt0b1JldHVyblsncmVwbGFjZUF0dHJpYnV0ZXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucmVwbGFjZUF0dHJpYnV0ZXMgPyAodGhpcy5yZXBsYWNlQXR0cmlidXRlcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5yZXBsYWNlQXR0cmlidXRlczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hZGRBdHRyaWJ1dGVzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmFkZEF0dHJpYnV0ZXMgIT09IG51bGwpIHt0b1JldHVyblsnYWRkQXR0cmlidXRlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5hZGRBdHRyaWJ1dGVzID8gKHRoaXMuYWRkQXR0cmlidXRlcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5hZGRBdHRyaWJ1dGVzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlbW92ZUF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucmVtb3ZlQXR0cmlidXRlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydyZW1vdmVBdHRyaWJ1dGVzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnJlbW92ZUF0dHJpYnV0ZXMgPyAodGhpcy5yZW1vdmVBdHRyaWJ1dGVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnJlbW92ZUF0dHJpYnV0ZXM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTmFtZXNwYWNlZENvbnRleHQgaW1wbGVtZW50cyBpLk5hbWVzcGFjZWRDb250ZXh0SW50ZXJmYWNlIHtcbiAgICBuYW1lc3BhY2U6IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBOYW1lc3BhY2VkQ29udGV4dCB7XG4gICAgICAgIGxldCBtID0gbmV3IE5hbWVzcGFjZWRDb250ZXh0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5OYW1lc3BhY2VkQ29udGV4dEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm5hbWVzcGFjZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbmFtZXNwYWNlJ10gPSB0aGlzLm5hbWVzcGFjZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50eXBlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd0eXBlJ10gPSB0aGlzLnR5cGU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGVyc29uYSBpbXBsZW1lbnRzIGkuUGVyc29uYUludGVyZmFjZSB7XG4gICAgc3ViamVjdDogU3ViamVjdDtcbiAgICBjb250ZXh0OiBDb250ZXh0O1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogUGVyc29uYSB7XG4gICAgICAgIGxldCBtID0gbmV3IFBlcnNvbmEoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uc3ViamVjdCkge20uc3ViamVjdCA9IFN1YmplY3QuZnJvbVByb3RvKHByb3RvLnN1YmplY3QpO31cbiAgICAgICAgaWYgKHByb3RvLmNvbnRleHQpIHttLmNvbnRleHQgPSBDb250ZXh0LmZyb21Qcm90byhwcm90by5jb250ZXh0KTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuUGVyc29uYUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN1YmplY3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuc3ViamVjdCAhPT0gbnVsbCkge3RvUmV0dXJuWydzdWJqZWN0J10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnN1YmplY3QgPyAodGhpcy5zdWJqZWN0IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnN1YmplY3Q7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5jb250ZXh0ICE9PSBudWxsKSB7dG9SZXR1cm5bJ2NvbnRleHQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuY29udGV4dCA/ICh0aGlzLmNvbnRleHQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuY29udGV4dDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQdWJsaWNLZXkgaW1wbGVtZW50cyBpLlB1YmxpY0tleUludGVyZmFjZSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgaWQ6IHN0cmluZztcbiAgICBhbGdvcml0aG1UeXBlOiBlLkFsZ29yaXRobVR5cGU7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBQdWJsaWNLZXkge1xuICAgICAgICBsZXQgbSA9IG5ldyBQdWJsaWNLZXkoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uYWxnb3JpdGhtVHlwZSkge20uYWxnb3JpdGhtVHlwZSA9IGVudW1TdHJpbmdUb1ZhbHVlPGUuQWxnb3JpdGhtVHlwZT4oZS5BbGdvcml0aG1UeXBlLCBwcm90by5hbGdvcml0aG1UeXBlKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuUHVibGljS2V5SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMua2V5ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydrZXknXSA9IHRoaXMua2V5O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpZCddID0gdGhpcy5pZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hbGdvcml0aG1UeXBlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydhbGdvcml0aG1UeXBlJ10gPSB0aGlzLmFsZ29yaXRobVR5cGU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlcnkgaW1wbGVtZW50cyBpLlF1ZXJ5SW50ZXJmYWNlIHtcbiAgICBzZWFyY2hUZXJtOiBzdHJpbmc7XG4gICAgYXR0cmlidXRlS2V5czogc3RyaW5nW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBRdWVyeSB7XG4gICAgICAgIGxldCBtID0gbmV3IFF1ZXJ5KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5RdWVyeUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNlYXJjaFRlcm0gIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3NlYXJjaFRlcm0nXSA9IHRoaXMuc2VhcmNoVGVybTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hdHRyaWJ1dGVLZXlzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydhdHRyaWJ1dGVLZXlzJ10gPSB0aGlzLmF0dHJpYnV0ZUtleXM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2luZ2xlVmFsdWVBdHRyaWJ1dGUgaW1wbGVtZW50cyBpLlNpbmdsZVZhbHVlQXR0cmlidXRlSW50ZXJmYWNlIHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU2luZ2xlVmFsdWVBdHRyaWJ1dGUge1xuICAgICAgICBsZXQgbSA9IG5ldyBTaW5nbGVWYWx1ZUF0dHJpYnV0ZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuU2luZ2xlVmFsdWVBdHRyaWJ1dGVJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5rZXkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2tleSddID0gdGhpcy5rZXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3ZhbHVlJ10gPSB0aGlzLnZhbHVlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1YmplY3QgaW1wbGVtZW50cyBpLlN1YmplY3RJbnRlcmZhY2Uge1xuICAgIHN1YmplY3RJZDogc3RyaW5nO1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgdXNlcklkOiBzdHJpbmc7XG4gICAgcGFydG5lcklkOiBzdHJpbmc7XG4gICAgYXR0cmlidXRlczogTXVsdGlWYWx1ZUF0dHJpYnV0ZVtdO1xuICAgIGNyZWF0ZWQ6IERhdGU7XG4gICAgdXBkYXRlZDogRGF0ZTtcbiAgICBsYXN0TG9naW46IERhdGU7XG4gICAgcHVibGljS2V5czogUHVibGljS2V5W107XG4gICAgc3RydWN0QXR0cmlidXRlczogU3RydWN0QXR0cmlidXRlO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU3ViamVjdCB7XG4gICAgICAgIGxldCBtID0gbmV3IFN1YmplY3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uYXR0cmlidXRlcykge20uYXR0cmlidXRlcyA9IHByb3RvLmF0dHJpYnV0ZXMubWFwKE11bHRpVmFsdWVBdHRyaWJ1dGUuZnJvbVByb3RvKTt9XG4gICAgICAgIGlmIChwcm90by5jcmVhdGVkKSB7bS5jcmVhdGVkID0gbmV3IERhdGUocHJvdG8uY3JlYXRlZCk7fVxuICAgICAgICBpZiAocHJvdG8udXBkYXRlZCkge20udXBkYXRlZCA9IG5ldyBEYXRlKHByb3RvLnVwZGF0ZWQpO31cbiAgICAgICAgaWYgKHByb3RvLmxhc3RMb2dpbikge20ubGFzdExvZ2luID0gbmV3IERhdGUocHJvdG8ubGFzdExvZ2luKTt9XG4gICAgICAgIGlmIChwcm90by5wdWJsaWNLZXlzKSB7bS5wdWJsaWNLZXlzID0gcHJvdG8ucHVibGljS2V5cy5tYXAoUHVibGljS2V5LmZyb21Qcm90byk7fVxuICAgICAgICBpZiAocHJvdG8uc3RydWN0QXR0cmlidXRlcykge20uc3RydWN0QXR0cmlidXRlcyA9IFN0cnVjdEF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8uc3RydWN0QXR0cmlidXRlcyk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlN1YmplY3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdWJqZWN0SWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3N1YmplY3RJZCddID0gdGhpcy5zdWJqZWN0SWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZW1haWwgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2VtYWlsJ10gPSB0aGlzLmVtYWlsO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnVzZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndXNlcklkJ10gPSB0aGlzLnVzZXJJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wYXJ0bmVySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3BhcnRuZXJJZCddID0gdGhpcy5wYXJ0bmVySWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYXR0cmlidXRlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5hdHRyaWJ1dGVzICE9PSBudWxsKSB7dG9SZXR1cm5bJ2F0dHJpYnV0ZXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuYXR0cmlidXRlcyA/ICh0aGlzLmF0dHJpYnV0ZXMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuYXR0cmlidXRlczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jcmVhdGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmNyZWF0ZWQgIT09IG51bGwpIHt0b1JldHVyblsnY3JlYXRlZCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5jcmVhdGVkID8gKHRoaXMuY3JlYXRlZCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5jcmVhdGVkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnVwZGF0ZWQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudXBkYXRlZCAhPT0gbnVsbCkge3RvUmV0dXJuWyd1cGRhdGVkJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnVwZGF0ZWQgPyAodGhpcy51cGRhdGVkIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnVwZGF0ZWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubGFzdExvZ2luICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmxhc3RMb2dpbiAhPT0gbnVsbCkge3RvUmV0dXJuWydsYXN0TG9naW4nXSA9ICd0b0FwaUpzb24nIGluIHRoaXMubGFzdExvZ2luID8gKHRoaXMubGFzdExvZ2luIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmxhc3RMb2dpbjt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wdWJsaWNLZXlzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnB1YmxpY0tleXMgIT09IG51bGwpIHt0b1JldHVyblsncHVibGljS2V5cyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5wdWJsaWNLZXlzID8gKHRoaXMucHVibGljS2V5cyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wdWJsaWNLZXlzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN0cnVjdEF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuc3RydWN0QXR0cmlidXRlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydzdHJ1Y3RBdHRyaWJ1dGVzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnN0cnVjdEF0dHJpYnV0ZXMgPyAodGhpcy5zdHJ1Y3RBdHRyaWJ1dGVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnN0cnVjdEF0dHJpYnV0ZXM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3ViamVjdFJlc3VsdCBpbXBsZW1lbnRzIGkuU3ViamVjdFJlc3VsdEludGVyZmFjZSB7XG4gICAgc3ViamVjdDogU3ViamVjdDtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFN1YmplY3RSZXN1bHQge1xuICAgICAgICBsZXQgbSA9IG5ldyBTdWJqZWN0UmVzdWx0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnN1YmplY3QpIHttLnN1YmplY3QgPSBTdWJqZWN0LmZyb21Qcm90byhwcm90by5zdWJqZWN0KTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuU3ViamVjdFJlc3VsdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN1YmplY3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuc3ViamVjdCAhPT0gbnVsbCkge3RvUmV0dXJuWydzdWJqZWN0J10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnN1YmplY3QgPyAodGhpcy5zdWJqZWN0IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnN1YmplY3Q7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHlwZWRDb250ZXh0IGltcGxlbWVudHMgaS5UeXBlZENvbnRleHRJbnRlcmZhY2Uge1xuICAgIHR5cGU6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFR5cGVkQ29udGV4dCB7XG4gICAgICAgIGxldCBtID0gbmV3IFR5cGVkQ29udGV4dCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuVHlwZWRDb250ZXh0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndHlwZSddID0gdGhpcy50eXBlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuIl19