@ragemp-mango/core 1.1.0 → 1.2.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/dist/app/index.d.ts +10 -2
- package/dist/app/index.js +1 -1
- package/dist/app/module-tree/index.js +1 -1
- package/dist/chunk-2ODN36G4.js +170 -0
- package/dist/{chunk-UEGF22IW.js → chunk-BQFJLVDO.js} +31 -54
- package/dist/chunk-CYKAWXQO.js +1869 -0
- package/dist/chunk-OLMOKTKA.js +176 -0
- package/dist/chunk-X5HSQNOE.js +570 -0
- package/dist/chunk-XIBSYLJ4.js +139 -0
- package/dist/decorators/index.d.ts +2 -3
- package/dist/decorators/index.js +1 -1
- package/dist/index.js +1 -1
- package/dist/services/index.js +1 -1
- package/package.json +1 -1
package/dist/app/index.d.ts
CHANGED
|
@@ -108,12 +108,20 @@ declare class App {
|
|
|
108
108
|
private runPluginMethods;
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
interface AppBuilderConfig {
|
|
112
|
+
enviroment: AppEnviroment;
|
|
113
|
+
internalAppContainer: Container;
|
|
114
|
+
multiplayerService: MultiplayerService;
|
|
115
|
+
plugins: Newable<MangoPlugin>[];
|
|
116
|
+
}
|
|
117
|
+
|
|
111
118
|
declare class AppBuilder<G extends Guard = Guard, I extends Interceptor = Interceptor, EF extends ErrorFilter = ErrorFilter> {
|
|
112
|
-
protected readonly enviroment:
|
|
119
|
+
protected readonly enviroment: AppEnviroment;
|
|
113
120
|
protected readonly internalAppContainer: Container;
|
|
114
121
|
protected readonly multiplayerService: MultiplayerService;
|
|
115
122
|
protected readonly plugins: Newable<MangoPlugin>[];
|
|
116
123
|
private globalContainerOptions;
|
|
124
|
+
constructor(config: AppBuilderConfig);
|
|
117
125
|
useGlobalGuards(...guards: (Newable<G> | G)[]): this;
|
|
118
126
|
useGlobalInterceptors(...interceptors: (Newable<I> | I)[]): this;
|
|
119
127
|
useGlobalPipes(...pipes: (Newable<Pipe> | Pipe)[]): this;
|
|
@@ -127,7 +135,7 @@ declare class AppBuilder<G extends Guard = Guard, I extends Interceptor = Interc
|
|
|
127
135
|
declare function createAppBuilder<T extends AppBuilder>({ enviroment, plugins, appBuilderInherit, multiplayerService, }: {
|
|
128
136
|
enviroment: AppEnviroment;
|
|
129
137
|
plugins: Newable<MangoPlugin>[];
|
|
130
|
-
appBuilderInherit:
|
|
138
|
+
appBuilderInherit: new (config: AppBuilderConfig) => T;
|
|
131
139
|
multiplayerService?: MultiplayerService;
|
|
132
140
|
}): Promise<T>;
|
|
133
141
|
|
package/dist/app/index.js
CHANGED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import {
|
|
2
|
+
RPC_RESULT_HANDLER_NOT_FOUND,
|
|
3
|
+
RPC_RESULT_TIMEOUT,
|
|
4
|
+
RPC_RESULT_UNKNOWN
|
|
5
|
+
} from "./chunk-HK7QTFPA.js";
|
|
6
|
+
import {
|
|
7
|
+
MangoError
|
|
8
|
+
} from "./chunk-6YEWPMZJ.js";
|
|
9
|
+
import {
|
|
10
|
+
ErrorMessage,
|
|
11
|
+
RPCResultStatus
|
|
12
|
+
} from "./chunk-DXPVUDXD.js";
|
|
13
|
+
import {
|
|
14
|
+
LOGGER_SERVICE
|
|
15
|
+
} from "./chunk-DJZCOYB3.js";
|
|
16
|
+
import {
|
|
17
|
+
__name
|
|
18
|
+
} from "./chunk-7QVYU63E.js";
|
|
19
|
+
|
|
20
|
+
// src/app/services/base-event.service.ts
|
|
21
|
+
import { injectable } from "inversify";
|
|
22
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
23
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
24
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
25
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
26
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
27
|
+
}
|
|
28
|
+
__name(_ts_decorate, "_ts_decorate");
|
|
29
|
+
function _ts_metadata(k, v) {
|
|
30
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
31
|
+
}
|
|
32
|
+
__name(_ts_metadata, "_ts_metadata");
|
|
33
|
+
var BaseEventService = class {
|
|
34
|
+
static {
|
|
35
|
+
__name(this, "BaseEventService");
|
|
36
|
+
}
|
|
37
|
+
$eventEmmiter;
|
|
38
|
+
$localHandlers = /* @__PURE__ */ new Set();
|
|
39
|
+
$internalHandlers = /* @__PURE__ */ new Set();
|
|
40
|
+
$remoteHandlers = /* @__PURE__ */ new Set();
|
|
41
|
+
$internalEventNames = /* @__PURE__ */ new Set();
|
|
42
|
+
constructor($eventEmmiter) {
|
|
43
|
+
this.$eventEmmiter = $eventEmmiter;
|
|
44
|
+
}
|
|
45
|
+
on(eventName, callback) {
|
|
46
|
+
const wrapper = /* @__PURE__ */ __name((...args) => callback(args[0]), "wrapper");
|
|
47
|
+
const eventHandler = this.$eventEmmiter.on(eventName, wrapper);
|
|
48
|
+
this.$localHandlers.add(eventHandler);
|
|
49
|
+
return eventHandler;
|
|
50
|
+
}
|
|
51
|
+
once(eventName, callback) {
|
|
52
|
+
const wrapper = /* @__PURE__ */ __name((...args) => callback(args[0]), "wrapper");
|
|
53
|
+
const eventHandler = this.$eventEmmiter.once(eventName, wrapper);
|
|
54
|
+
this.$localHandlers.add(eventHandler);
|
|
55
|
+
return eventHandler;
|
|
56
|
+
}
|
|
57
|
+
emit(eventName, body) {
|
|
58
|
+
this.$eventEmmiter.emit(eventName, body);
|
|
59
|
+
}
|
|
60
|
+
$onInternal(eventName, handler) {
|
|
61
|
+
if (!this.$internalEventNames.has(eventName)) {
|
|
62
|
+
throw new Error(ErrorMessage.InvalidInternalEventName);
|
|
63
|
+
}
|
|
64
|
+
const eventHandler = this.$eventEmmiter.on(eventName, handler);
|
|
65
|
+
this.$internalHandlers.add(eventHandler);
|
|
66
|
+
return eventHandler;
|
|
67
|
+
}
|
|
68
|
+
$onceInternal(eventName, handler) {
|
|
69
|
+
if (!this.$internalEventNames.has(eventName)) {
|
|
70
|
+
throw new Error(ErrorMessage.InvalidInternalEventName);
|
|
71
|
+
}
|
|
72
|
+
const eventHandler = this.$eventEmmiter.once(eventName, handler);
|
|
73
|
+
this.$internalHandlers.add(eventHandler);
|
|
74
|
+
return eventHandler;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
BaseEventService = _ts_decorate([
|
|
78
|
+
injectable(),
|
|
79
|
+
_ts_metadata("design:type", Function),
|
|
80
|
+
_ts_metadata("design:paramtypes", [
|
|
81
|
+
typeof EventEmmiter === "undefined" ? Object : EventEmmiter
|
|
82
|
+
])
|
|
83
|
+
], BaseEventService);
|
|
84
|
+
|
|
85
|
+
// src/app/services/base-rpc.service.ts
|
|
86
|
+
import { inject, injectable as injectable2 } from "inversify";
|
|
87
|
+
function _ts_decorate2(decorators, target, key, desc) {
|
|
88
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
89
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
90
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
91
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
92
|
+
}
|
|
93
|
+
__name(_ts_decorate2, "_ts_decorate");
|
|
94
|
+
function _ts_metadata2(k, v) {
|
|
95
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
96
|
+
}
|
|
97
|
+
__name(_ts_metadata2, "_ts_metadata");
|
|
98
|
+
var BaseRPCService = class {
|
|
99
|
+
static {
|
|
100
|
+
__name(this, "BaseRPCService");
|
|
101
|
+
}
|
|
102
|
+
$loggerService;
|
|
103
|
+
$TIMEOUT = 2e3;
|
|
104
|
+
$localHandlers = /* @__PURE__ */ new Map();
|
|
105
|
+
async call(rpcName, body, options = {
|
|
106
|
+
timeout: this.$TIMEOUT
|
|
107
|
+
}) {
|
|
108
|
+
return new Promise(async (resolve) => {
|
|
109
|
+
const handler = this.$localHandlers.get(rpcName)?.handler;
|
|
110
|
+
if (!handler) {
|
|
111
|
+
return resolve(RPC_RESULT_HANDLER_NOT_FOUND);
|
|
112
|
+
}
|
|
113
|
+
const timeoutId = setTimeout(() => {
|
|
114
|
+
resolve(RPC_RESULT_TIMEOUT);
|
|
115
|
+
}, options.timeout ?? this.$TIMEOUT);
|
|
116
|
+
try {
|
|
117
|
+
const result = await handler(body);
|
|
118
|
+
clearTimeout(timeoutId);
|
|
119
|
+
resolve({
|
|
120
|
+
success: true,
|
|
121
|
+
status: RPCResultStatus.Success,
|
|
122
|
+
body: result
|
|
123
|
+
});
|
|
124
|
+
} catch (error) {
|
|
125
|
+
clearTimeout(timeoutId);
|
|
126
|
+
if (error instanceof MangoError) {
|
|
127
|
+
return resolve({
|
|
128
|
+
success: false,
|
|
129
|
+
status: error.status,
|
|
130
|
+
error: {
|
|
131
|
+
message: error.message,
|
|
132
|
+
details: error.details
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
resolve(RPC_RESULT_UNKNOWN);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
onRequest(rpcName, handler) {
|
|
141
|
+
if (this.$localHandlers.has(rpcName)) {
|
|
142
|
+
this.$loggerService.error("An error occurred while trying to register RPC.");
|
|
143
|
+
throw new Error(ErrorMessage.RPCHandlerAlreadyExists);
|
|
144
|
+
}
|
|
145
|
+
const rpcHandler = {
|
|
146
|
+
destroy: /* @__PURE__ */ __name(() => {
|
|
147
|
+
rpcHandler.valid = false;
|
|
148
|
+
this.$localHandlers.delete(rpcName);
|
|
149
|
+
}, "destroy"),
|
|
150
|
+
rpcName,
|
|
151
|
+
handler,
|
|
152
|
+
valid: true
|
|
153
|
+
};
|
|
154
|
+
this.$localHandlers.set(rpcName, rpcHandler);
|
|
155
|
+
return rpcHandler;
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
_ts_decorate2([
|
|
159
|
+
inject(LOGGER_SERVICE),
|
|
160
|
+
_ts_metadata2("design:type", typeof LoggerService === "undefined" ? Object : LoggerService)
|
|
161
|
+
], BaseRPCService.prototype, "$loggerService", void 0);
|
|
162
|
+
BaseRPCService = _ts_decorate2([
|
|
163
|
+
injectable2()
|
|
164
|
+
], BaseRPCService);
|
|
165
|
+
|
|
166
|
+
export {
|
|
167
|
+
BaseEventService,
|
|
168
|
+
BaseRPCService
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2FwcC9zZXJ2aWNlcy9iYXNlLWV2ZW50LnNlcnZpY2UudHMiLCAiLi4vc3JjL2FwcC9zZXJ2aWNlcy9iYXNlLXJwYy5zZXJ2aWNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB0eXBlIHsgRXZlbnRFbW1pdGVyLCBTY3JpcHRFdmVudEhhbmRsZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRXZlbnRTZXJ2aWNlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5ICRsb2NhbEhhbmRsZXJzOiBTZXQ8U2NyaXB0RXZlbnRIYW5kbGVyPiA9IG5ldyBTZXQoKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgJGludGVybmFsSGFuZGxlcnM6IFNldDxTY3JpcHRFdmVudEhhbmRsZXI+ID0gbmV3IFNldCgpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSAkcmVtb3RlSGFuZGxlcnM6IFNldDxTY3JpcHRFdmVudEhhbmRsZXI+ID0gbmV3IFNldCgpO1xuICAgIHByb3RlY3RlZCAkaW50ZXJuYWxFdmVudE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkICRldmVudEVtbWl0ZXI6IEV2ZW50RW1taXRlcikge31cblxuICAgIHB1YmxpYyBvbjxFIGV4dGVuZHMga2V5b2YgVD4oZXZlbnROYW1lOiBFLCBjYWxsYmFjazogKGJvZHk6IFBhcmFtZXRlcnM8VFtFXT5bMF0pID0+IFJldHVyblR5cGU8VFtFXT4pOiBTY3JpcHRFdmVudEhhbmRsZXI7XG4gICAgcHVibGljIG9uPEUgZXh0ZW5kcyBzdHJpbmc+KGV2ZW50TmFtZTogRXhjbHVkZTxFLCBrZXlvZiBUPiwgY2FsbGJhY2s6IChib2R5OiB1bmtub3duKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPik6IFNjcmlwdEV2ZW50SGFuZGxlcjtcbiAgICBwdWJsaWMgb248RSBleHRlbmRzIHN0cmluZz4oZXZlbnROYW1lOiBFeGNsdWRlPEUsIGtleW9mIFQ+LCBjYWxsYmFjazogKGJvZHk6IHVua25vd24pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSAoLi4uYXJnczogYW55W10pID0+IGNhbGxiYWNrKGFyZ3NbMF0pO1xuICAgICAgICBjb25zdCBldmVudEhhbmRsZXIgPSA8U2NyaXB0RXZlbnRIYW5kbGVyPnRoaXMuJGV2ZW50RW1taXRlci5vbihldmVudE5hbWUsIHdyYXBwZXIpO1xuICAgICAgICB0aGlzLiRsb2NhbEhhbmRsZXJzLmFkZChldmVudEhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gZXZlbnRIYW5kbGVyO1xuICAgIH1cbiAgICBwdWJsaWMgb25jZTxFIGV4dGVuZHMga2V5b2YgVD4oZXZlbnROYW1lOiBFLCBjYWxsYmFjazogKGJvZHk6IFBhcmFtZXRlcnM8VFtFXT5bMF0pID0+IFJldHVyblR5cGU8VFtFXT4pOiBTY3JpcHRFdmVudEhhbmRsZXI7XG4gICAgcHVibGljIG9uY2U8RSBleHRlbmRzIHN0cmluZz4oZXZlbnROYW1lOiBFeGNsdWRlPEUsIGtleW9mIFQ+LCBjYWxsYmFjazogKGJvZHk6IHVua25vd24pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KTogU2NyaXB0RXZlbnRIYW5kbGVyO1xuICAgIHB1YmxpYyBvbmNlPEUgZXh0ZW5kcyBzdHJpbmc+KGV2ZW50TmFtZTogRXhjbHVkZTxFLCBrZXlvZiBUPiwgY2FsbGJhY2s6IChib2R5OiB1bmtub3duKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikge1xuICAgICAgICBjb25zdCB3cmFwcGVyID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgY29uc3QgZXZlbnRIYW5kbGVyID0gPFNjcmlwdEV2ZW50SGFuZGxlcj50aGlzLiRldmVudEVtbWl0ZXIub25jZShldmVudE5hbWUsIHdyYXBwZXIpO1xuICAgICAgICB0aGlzLiRsb2NhbEhhbmRsZXJzLmFkZChldmVudEhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gZXZlbnRIYW5kbGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0PEUgZXh0ZW5kcyBrZXlvZiBUPihldmVudE5hbWU6IEUsIGJvZHk/OiBUW0VdKTogdm9pZDtcbiAgICBwdWJsaWMgZW1pdDxFIGV4dGVuZHMgc3RyaW5nPihldmVudE5hbWU6IEUsIGJvZHk/OiB1bmtub3duKTogdm9pZDtcbiAgICBwdWJsaWMgZW1pdDxFIGV4dGVuZHMgc3RyaW5nPihldmVudE5hbWU6IEUsIGJvZHk/OiB1bmtub3duKSB7XG4gICAgICAgIHRoaXMuJGV2ZW50RW1taXRlci5lbWl0KGV2ZW50TmFtZSwgYm9keSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkICRvbkludGVybmFsKGV2ZW50TmFtZTogc3RyaW5nLCBoYW5kbGVyOiAoYm9keTogdW5rbm93bikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLiRpbnRlcm5hbEV2ZW50TmFtZXMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuSW52YWxpZEludGVybmFsRXZlbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudEhhbmRsZXIgPSA8RXZlbnRIYW5kbGVyPnRoaXMuJGV2ZW50RW1taXRlci5vbihldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICB0aGlzLiRpbnRlcm5hbEhhbmRsZXJzLmFkZChldmVudEhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gZXZlbnRIYW5kbGVyO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCAkb25jZUludGVybmFsKGV2ZW50TmFtZTogc3RyaW5nLCBoYW5kbGVyOiAoYm9keTogdW5rbm93bikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLiRpbnRlcm5hbEV2ZW50TmFtZXMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFcnJvck1lc3NhZ2UuSW52YWxpZEludGVybmFsRXZlbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudEhhbmRsZXIgPSA8U2NyaXB0RXZlbnRIYW5kbGVyPnRoaXMuJGV2ZW50RW1taXRlci5vbmNlKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgIHRoaXMuJGludGVybmFsSGFuZGxlcnMuYWRkKGV2ZW50SGFuZGxlcik7XG4gICAgICAgIHJldHVybiBldmVudEhhbmRsZXI7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IGluamVjdCwgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgdHlwZSB7IFJQQ1Jlc3VsdCwgUlBDQ2FsbE9wdGlvbnMsIFNjcmlwdFJQQ0hhbmRsZXIsIExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFJQQ19SRVNVTFRfSEFORExFUl9OT1RfRk9VTkQsIFJQQ19SRVNVTFRfVElNRU9VVCwgUlBDX1JFU1VMVF9VTktOT1dOIH0gZnJvbSAnLi4vLi4vYXBwL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBFcnJvck1lc3NhZ2UsIFJQQ1Jlc3VsdFN0YXR1cyB9IGZyb20gJy4uLy4uL2VudW1zJztcbmltcG9ydCB7IE1hbmdvRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMnO1xuaW1wb3J0IHsgTE9HR0VSX1NFUlZJQ0UgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQmFzZVJQQ1NlcnZpY2U8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBAaW5qZWN0KExPR0dFUl9TRVJWSUNFKSBwcm90ZWN0ZWQgcmVhZG9ubHkgJGxvZ2dlclNlcnZpY2U6IExvZ2dlclNlcnZpY2U7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5ICRUSU1FT1VUID0gMjAwMDtcbiAgICBwcml2YXRlIHJlYWRvbmx5ICRsb2NhbEhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNjcmlwdFJQQ0hhbmRsZXI+KCk7XG5cbiAgICBwdWJsaWMgYXN5bmMgY2FsbDxFIGV4dGVuZHMga2V5b2YgVD4oXG4gICAgICAgIHJwY05hbWU6IEUsXG4gICAgICAgIGJvZHk/OiBQYXJhbWV0ZXJzPFRbRV0+WzBdLFxuICAgICAgICBvcHRpb25zPzogUlBDQ2FsbE9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxSUENSZXN1bHQ8UmV0dXJuVHlwZTxUW0VdPj4+O1xuICAgIHB1YmxpYyBhc3luYyBjYWxsPEUgZXh0ZW5kcyBzdHJpbmc+KHJwY05hbWU6IEUsIGJvZHk/OiB1bmtub3duLCBvcHRpb25zPzogUlBDQ2FsbE9wdGlvbnMpOiBQcm9taXNlPFJQQ1Jlc3VsdDx1bmtub3duPj47XG4gICAgcHVibGljIGFzeW5jIGNhbGw8RSBleHRlbmRzIHN0cmluZz4ocnBjTmFtZTogRSwgYm9keT86IHVua25vd24sIG9wdGlvbnM6IFJQQ0NhbGxPcHRpb25zID0geyB0aW1lb3V0OiB0aGlzLiRUSU1FT1VUIH0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy4kbG9jYWxIYW5kbGVycy5nZXQoPHN0cmluZz5ycGNOYW1lKT8uaGFuZGxlcjtcbiAgICAgICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKFJQQ19SRVNVTFRfSEFORExFUl9OT1RfRk9VTkQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKFJQQ19SRVNVTFRfVElNRU9VVCk7XG4gICAgICAgICAgICB9LCBvcHRpb25zLnRpbWVvdXQgPz8gdGhpcy4kVElNRU9VVCk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihib2R5KTtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogdHJ1ZSwgc3RhdHVzOiBSUENSZXN1bHRTdGF0dXMuU3VjY2VzcywgYm9keTogcmVzdWx0IH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE1hbmdvRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IGVycm9yLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiB7IG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIGRldGFpbHM6IGVycm9yLmRldGFpbHMgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShSUENfUkVTVUxUX1VOS05PV04pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIG9uUmVxdWVzdDxFIGV4dGVuZHMga2V5b2YgVD4ocnBjTmFtZTogRSwgaGFuZGxlcjogKGJvZHk6IFBhcmFtZXRlcnM8VFtFXT5bMF0pID0+IFJldHVyblR5cGU8VFtFXT4pOiBTY3JpcHRSUENIYW5kbGVyO1xuICAgIHB1YmxpYyBvblJlcXVlc3Q8RSBleHRlbmRzIHN0cmluZz4ocnBjTmFtZTogRSwgaGFuZGxlcjogKGJvZHk6IHVua25vd24pID0+IHVua25vd24gfCBQcm9taXNlPHVua25vd24+KTogU2NyaXB0UlBDSGFuZGxlcjtcbiAgICBwdWJsaWMgb25SZXF1ZXN0PEUgZXh0ZW5kcyBzdHJpbmc+KHJwY05hbWU6IEUsIGhhbmRsZXI6IChib2R5OiB1bmtub3duKSA9PiB1bmtub3duIHwgUHJvbWlzZTx1bmtub3duPikge1xuICAgICAgICBpZiAodGhpcy4kbG9jYWxIYW5kbGVycy5oYXMocnBjTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuJGxvZ2dlclNlcnZpY2UuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWdpc3RlciBSUEMuJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRXJyb3JNZXNzYWdlLlJQQ0hhbmRsZXJBbHJlYWR5RXhpc3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJwY0hhbmRsZXI6IFNjcmlwdFJQQ0hhbmRsZXIgPSB7XG4gICAgICAgICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHJwY0hhbmRsZXIudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLiRsb2NhbEhhbmRsZXJzLmRlbGV0ZShycGNOYW1lKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBycGNOYW1lOiBycGNOYW1lLFxuICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuJGxvY2FsSGFuZGxlcnMuc2V0KHJwY05hbWUsIHJwY0hhbmRs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O2NBQUVFLFNBQVNGLE1BQU1FO2NBQVNDLFNBQVNILE1BQU1HO1lBQVE7VUFDNUQsQ0FBQTtRQUNKO0FBRUFoQixnQkFBUWlCLGtCQUFBQTtNQUNaO0lBQ0osQ0FBQTtFQUNKO0VBR09DLFVBQTRCdkIsU0FBWU0sU0FBd0Q7QUFDbkcsUUFBSSxLQUFLVCxlQUFlMkIsSUFBSXhCLE9BQUFBLEdBQVU7QUFDbEMsV0FBS0wsZUFBZXVCLE1BQU0saURBQUE7QUFDMUIsWUFBTSxJQUFJTyxNQUFNQyxhQUFhQyx1QkFBdUI7SUFDeEQ7QUFFQSxVQUFNQyxhQUErQjtNQUNqQ0MsU0FBUyw2QkFBQTtBQUVMRCxtQkFBV0UsUUFBUTtBQUNuQixhQUFLakMsZUFBZWtDLE9BQU8vQixPQUFBQTtNQUMvQixHQUpTO01BS1RBO01BQ0FNO01BQ0F3QixPQUFPO0lBQ1g7QUFFQSxTQUFLakMsZUFBZW1DLElBQUloQyxTQUFTNEIsVUFBQUE7QUFFakMsV0FBT0E7RUFDWDtBQUNKOzs7Ozs7OzsiLAogICJuYW1lcyI6IFsiaW5qZWN0YWJsZSIsICJCYXNlRXZlbnRTZXJ2aWNlIiwgIiRsb2NhbEhhbmRsZXJzIiwgIlNldCIsICIkaW50ZXJuYWxIYW5kbGVycyIsICIkcmVtb3RlSGFuZGxlcnMiLCAiJGludGVybmFsRXZlbnROYW1lcyIsICIkZXZlbnRFbW1pdGVyIiwgIm9uIiwgImV2ZW50TmFtZSIsICJjYWxsYmFjayIsICJ3cmFwcGVyIiwgImFyZ3MiLCAiZXZlbnRIYW5kbGVyIiwgImFkZCIsICJvbmNlIiwgImVtaXQiLCAiYm9keSIsICIkb25JbnRlcm5hbCIsICJoYW5kbGVyIiwgImhhcyIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiSW52YWxpZEludGVybmFsRXZlbnROYW1lIiwgIiRvbmNlSW50ZXJuYWwiLCAiaW5qZWN0IiwgImluamVjdGFibGUiLCAiQmFzZVJQQ1NlcnZpY2UiLCAiJGxvZ2dlclNlcnZpY2UiLCAiJFRJTUVPVVQiLCAiJGxvY2FsSGFuZGxlcnMiLCAiTWFwIiwgImNhbGwiLCAicnBjTmFtZSIsICJib2R5IiwgIm9wdGlvbnMiLCAidGltZW91dCIsICJQcm9taXNlIiwgInJlc29sdmUiLCAiaGFuZGxlciIsICJnZXQiLCAiUlBDX1JFU1VMVF9IQU5ETEVSX05PVF9GT1VORCIsICJ0aW1lb3V0SWQiLCAic2V0VGltZW91dCIsICJSUENfUkVTVUxUX1RJTUVPVVQiLCAicmVzdWx0IiwgImNsZWFyVGltZW91dCIsICJzdWNjZXNzIiwgInN0YXR1cyIsICJSUENSZXN1bHRTdGF0dXMiLCAiU3VjY2VzcyIsICJlcnJvciIsICJNYW5nb0Vycm9yIiwgIm1lc3NhZ2UiLCAiZGV0YWlscyIsICJSUENfUkVTVUxUX1VOS05PV04iLCAib25SZXF1ZXN0IiwgImhhcyIsICJFcnJvciIsICJFcnJvck1lc3NhZ2UiLCAiUlBDSGFuZGxlckFscmVhZHlFeGlzdHMiLCAicnBjSGFuZGxlciIsICJkZXN0cm95IiwgInZhbGlkIiwgImRlbGV0ZSIsICJzZXQiXQp9Cg==
|