@garrix82/reactgenie-lib 1.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.
- package/.env.example +22 -0
- package/.github/workflows/publish.yml +20 -0
- package/LICENSE.txt +201 -0
- package/README.md +621 -0
- package/babel.config.js +29 -0
- package/dist/adapters/__tests__/expo-router-adapter.test.d.ts +1 -0
- package/dist/adapters/expo-router-adapter.d.ts +16 -0
- package/dist/adapters/expo-router-adapter.js +521 -0
- package/dist/adapters/navigation-adapter.d.ts +20 -0
- package/dist/adapters/navigation-adapter.js +137 -0
- package/dist/audio-visualizer.d.ts +14 -0
- package/dist/audio-visualizer.js +123 -0
- package/dist/current-selection.d.ts +27 -0
- package/dist/current-selection.js +94 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.js +37 -0
- package/dist/genie/DateTime.d.ts +66 -0
- package/dist/genie/DateTime.js +399 -0
- package/dist/genie/TimeDelta.d.ts +35 -0
- package/dist/genie/TimeDelta.js +169 -0
- package/dist/genie-view-wrapper.d.ts +1 -0
- package/dist/genie-view-wrapper.js +377 -0
- package/dist/hooks/__tests__/useSpeechRecognition.test.d.ts +1 -0
- package/dist/hooks/useSpeechRecognition.d.ts +28 -0
- package/dist/hooks/useSpeechRecognition.js +118 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +469 -0
- package/dist/logger.d.ts +23 -0
- package/dist/logger.js +597 -0
- package/dist/logger.remote.test.d.ts +0 -0
- package/dist/modality-provider-v2.d.ts +28 -0
- package/dist/modality-provider-v2.js +1321 -0
- package/dist/modality-provider.d.ts +22 -0
- package/dist/modality-provider.js +373 -0
- package/dist/native-visibility.d.ts +28 -0
- package/dist/native-visibility.js +50 -0
- package/dist/platform/VoiceRecognitionBar.d.ts +17 -0
- package/dist/platform/VoiceRecognitionBar.js +332 -0
- package/dist/platform/components.d.ts +32 -0
- package/dist/platform/components.js +351 -0
- package/dist/platform/events.d.ts +31 -0
- package/dist/platform/events.js +274 -0
- package/dist/platform/index.d.ts +3 -0
- package/dist/platform/index.js +39 -0
- package/dist/platform/types.d.ts +79 -0
- package/dist/platform/types.js +97 -0
- package/dist/react-decorators.d.ts +87 -0
- package/dist/react-decorators.js +368 -0
- package/dist/shared-store.d.ts +74 -0
- package/dist/shared-store.js +589 -0
- package/dist/speech-recognition/__tests__/speech-recognition-groq-transport.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-native.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-openai-native.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-openai.test.d.ts +1 -0
- package/dist/speech-recognition/__tests__/speech-recognition-unified-import.test.d.ts +0 -0
- package/dist/speech-recognition/__tests__/speech-recognition-unified.test.d.ts +1 -0
- package/dist/speech-recognition/speech-recognition-groq.d.ts +21 -0
- package/dist/speech-recognition/speech-recognition-groq.js +409 -0
- package/dist/speech-recognition/speech-recognition-mlx.d.ts +15 -0
- package/dist/speech-recognition/speech-recognition-mlx.js +393 -0
- package/dist/speech-recognition/speech-recognition-native.d.ts +24 -0
- package/dist/speech-recognition/speech-recognition-native.js +632 -0
- package/dist/speech-recognition/speech-recognition-openai-native.d.ts +40 -0
- package/dist/speech-recognition/speech-recognition-openai-native.js +653 -0
- package/dist/speech-recognition/speech-recognition-openai.d.ts +39 -0
- package/dist/speech-recognition/speech-recognition-openai.js +718 -0
- package/dist/speech-recognition/speech-recognition-unified.d.ts +93 -0
- package/dist/speech-recognition/speech-recognition-unified.js +589 -0
- package/dist/speech-recognition/utils/groq-transcription.d.ts +41 -0
- package/dist/speech-recognition/utils/groq-transcription.js +382 -0
- package/dist/speech-recognition.d.ts +7 -0
- package/dist/speech-recognition.js +61 -0
- package/dist/voice-pipeline-telemetry.d.ts +26 -0
- package/dist/voice-pipeline-telemetry.js +15 -0
- package/garrix82-reactgenie-lib-1.3.0.tgz +0 -0
- package/metro/index.js +3 -0
- package/metro/with-genie-registry.js +47 -0
- package/package.json +111 -0
- package/scripts/dry-run.js +23 -0
- package/scripts/generate-genie-registry.js +278 -0
- package/scripts/log-file-test.js +51 -0
- package/scripts/parse.js +26 -0
- package/scripts/prompt.js +19 -0
- package/scripts/set-script.js +200 -0
- package/tsconfig.json +36 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.TimeDelta = void 0;
|
|
7
|
+
var _reactgenieDsl = require("@garrix82/reactgenie-dsl");
|
|
8
|
+
require("reflect-metadata");
|
|
9
|
+
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec0, _dec1, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _dec32, _class, _class2, _descriptor, _descriptor2, _descriptor3, _TimeDelta;
|
|
10
|
+
function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); }
|
|
11
|
+
function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; }
|
|
12
|
+
function _initializerWarningHelper(r, e) { throw Error("Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform."); }
|
|
13
|
+
let TimeDelta = exports.TimeDelta = (_dec = (0, _reactgenieDsl.GenieClass)("Delta time"), _dec2 = Reflect.metadata("design:type", Function), _dec3 = Reflect.metadata("design:paramtypes", [Object]), _dec4 = Reflect.metadata("design:destructuringparamtypes", [{
|
|
14
|
+
hour: {
|
|
15
|
+
type: Number,
|
|
16
|
+
optional: true
|
|
17
|
+
},
|
|
18
|
+
minute: {
|
|
19
|
+
type: Number,
|
|
20
|
+
optional: true
|
|
21
|
+
},
|
|
22
|
+
second: {
|
|
23
|
+
type: Number,
|
|
24
|
+
optional: true
|
|
25
|
+
}
|
|
26
|
+
}]), _dec5 = Reflect.metadata("design:destructuringparamvalues", [{
|
|
27
|
+
hour: "0",
|
|
28
|
+
minute: "0",
|
|
29
|
+
second: "0"
|
|
30
|
+
}]), _dec6 = (0, _reactgenieDsl.GenieProperty)(), _dec7 = Reflect.metadata("design:type", Number), _dec8 = (0, _reactgenieDsl.GenieProperty)(), _dec9 = Reflect.metadata("design:type", Number), _dec0 = (0, _reactgenieDsl.GenieProperty)(), _dec1 = Reflect.metadata("design:type", Number), _dec10 = (0, _reactgenieDsl.GenieFunction)("Create a new TimeDelta object"), _dec11 = Reflect.metadata("design:type", Function), _dec12 = Reflect.metadata("design:paramtypes", [Object]), _dec13 = Reflect.metadata("design:returntype", "TimeDelta"), _dec14 = Reflect.metadata("design:is_static", true), _dec15 = Reflect.metadata("design:destructuringparamtypes", [{
|
|
31
|
+
hour: {
|
|
32
|
+
type: Number,
|
|
33
|
+
optional: true
|
|
34
|
+
},
|
|
35
|
+
minute: {
|
|
36
|
+
type: Number,
|
|
37
|
+
optional: true
|
|
38
|
+
},
|
|
39
|
+
second: {
|
|
40
|
+
type: Number,
|
|
41
|
+
optional: true
|
|
42
|
+
}
|
|
43
|
+
}]), _dec16 = Reflect.metadata("design:destructuringparamvalues", [{
|
|
44
|
+
hour: "0",
|
|
45
|
+
minute: "0",
|
|
46
|
+
second: "0"
|
|
47
|
+
}]), _dec17 = (0, _reactgenieDsl.GenieFunction)("Add a offset to the time"), _dec18 = Reflect.metadata("design:type", Function), _dec19 = Reflect.metadata("design:paramtypes", [Object]), _dec20 = Reflect.metadata("design:returntype", "void"), _dec21 = Reflect.metadata("design:destructuringparamtypes", [{
|
|
48
|
+
hour: {
|
|
49
|
+
type: Number,
|
|
50
|
+
optional: true
|
|
51
|
+
},
|
|
52
|
+
minute: {
|
|
53
|
+
type: Number,
|
|
54
|
+
optional: true
|
|
55
|
+
},
|
|
56
|
+
second: {
|
|
57
|
+
type: Number,
|
|
58
|
+
optional: true
|
|
59
|
+
}
|
|
60
|
+
}]), _dec22 = Reflect.metadata("design:destructuringparamvalues", [{
|
|
61
|
+
hour: "0",
|
|
62
|
+
minute: "0",
|
|
63
|
+
second: "0"
|
|
64
|
+
}]), _dec23 = (0, _reactgenieDsl.GenieFunction)("Set the value to the time"), _dec24 = Reflect.metadata("design:type", Function), _dec25 = Reflect.metadata("design:paramtypes", [Object]), _dec26 = Reflect.metadata("design:returntype", "void"), _dec27 = Reflect.metadata("design:destructuringparamtypes", [{
|
|
65
|
+
hour: {
|
|
66
|
+
type: Number,
|
|
67
|
+
optional: true
|
|
68
|
+
},
|
|
69
|
+
minute: {
|
|
70
|
+
type: Number,
|
|
71
|
+
optional: true
|
|
72
|
+
},
|
|
73
|
+
second: {
|
|
74
|
+
type: Number,
|
|
75
|
+
optional: true
|
|
76
|
+
}
|
|
77
|
+
}]), _dec28 = Reflect.metadata("design:destructuringparamvalues", [{
|
|
78
|
+
hour: "0",
|
|
79
|
+
minute: "0",
|
|
80
|
+
second: "0"
|
|
81
|
+
}]), _dec29 = (0, _reactgenieDsl.GenieFunction)("Get the second of the TimeDelta object"), _dec30 = Reflect.metadata("design:type", Function), _dec31 = Reflect.metadata("design:paramtypes", []), _dec32 = Reflect.metadata("design:returntype", Number), _dec(_class = _dec2(_class = _dec3(_class = _dec4(_class = _dec5(_class = (_class2 = (_TimeDelta = class TimeDelta extends _reactgenieDsl.HelperClass {
|
|
82
|
+
constructor({
|
|
83
|
+
hour = 0,
|
|
84
|
+
minute = 0,
|
|
85
|
+
second = 0
|
|
86
|
+
}) {
|
|
87
|
+
super({});
|
|
88
|
+
_initializerDefineProperty(this, "hour", _descriptor, this);
|
|
89
|
+
_initializerDefineProperty(this, "minute", _descriptor2, this);
|
|
90
|
+
_initializerDefineProperty(this, "second", _descriptor3, this);
|
|
91
|
+
this.hour = hour;
|
|
92
|
+
this.minute = minute;
|
|
93
|
+
this.second = second;
|
|
94
|
+
}
|
|
95
|
+
static setup() {}
|
|
96
|
+
|
|
97
|
+
// custom comparator for sorting
|
|
98
|
+
static compare(a, b) {
|
|
99
|
+
console.log(a.getLeftSecond(), b.getLeftSecond());
|
|
100
|
+
return a.getLeftSecond() - b.getLeftSecond();
|
|
101
|
+
}
|
|
102
|
+
static CreateTimeDelta({
|
|
103
|
+
hour = 0,
|
|
104
|
+
minute = 0,
|
|
105
|
+
second = 0
|
|
106
|
+
}) {
|
|
107
|
+
return TimeDelta.CreateObject({
|
|
108
|
+
hour: hour,
|
|
109
|
+
minute: minute,
|
|
110
|
+
second: second
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
addOffset({
|
|
114
|
+
hour = 0,
|
|
115
|
+
minute = 0,
|
|
116
|
+
second = 0
|
|
117
|
+
}) {
|
|
118
|
+
const offsettime = this.getLeftSecond() + hour * 3600 + minute * 60 + second;
|
|
119
|
+
if (offsettime < 0) {
|
|
120
|
+
this.hour = 0;
|
|
121
|
+
this.minute = 0;
|
|
122
|
+
this.second = 0;
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.hour = Math.floor(offsettime / 3600);
|
|
126
|
+
this.minute = Math.floor(offsettime % 3600 / 60);
|
|
127
|
+
this.second = offsettime % 60;
|
|
128
|
+
}
|
|
129
|
+
setTime({
|
|
130
|
+
hour = 0,
|
|
131
|
+
minute = 0,
|
|
132
|
+
second = 0
|
|
133
|
+
}) {
|
|
134
|
+
this.hour = hour;
|
|
135
|
+
this.minute = minute;
|
|
136
|
+
this.second = second;
|
|
137
|
+
}
|
|
138
|
+
getLeftSecond() {
|
|
139
|
+
return this.second + this.minute * 60 + this.hour * 3600;
|
|
140
|
+
}
|
|
141
|
+
toString() {
|
|
142
|
+
return `${this.hour}:${this.minute}:${this.second}`;
|
|
143
|
+
}
|
|
144
|
+
}, _TimeDelta.Examples = [{
|
|
145
|
+
user_utterance: "20 minutes later",
|
|
146
|
+
example_parsed: "TimeDelta.CreateObject(minute: 20)"
|
|
147
|
+
}, {
|
|
148
|
+
user_utterance: "1hour later",
|
|
149
|
+
example_parsed: "TimeDelta.CreateObject(hour: 1)"
|
|
150
|
+
}, {
|
|
151
|
+
user_utterance: "1hour 20 minutes later",
|
|
152
|
+
example_parsed: "TimeDelta.CreateObject(hour: 1, minute: 20)"
|
|
153
|
+
}], _TimeDelta), _descriptor = _applyDecoratedDescriptor(_class2.prototype, "hour", [_dec6, _dec7], {
|
|
154
|
+
configurable: true,
|
|
155
|
+
enumerable: true,
|
|
156
|
+
writable: true,
|
|
157
|
+
initializer: null
|
|
158
|
+
}), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "minute", [_dec8, _dec9], {
|
|
159
|
+
configurable: true,
|
|
160
|
+
enumerable: true,
|
|
161
|
+
writable: true,
|
|
162
|
+
initializer: null
|
|
163
|
+
}), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "second", [_dec0, _dec1], {
|
|
164
|
+
configurable: true,
|
|
165
|
+
enumerable: true,
|
|
166
|
+
writable: true,
|
|
167
|
+
initializer: null
|
|
168
|
+
}), _applyDecoratedDescriptor(_class2, "CreateTimeDelta", [_dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16], Object.getOwnPropertyDescriptor(_class2, "CreateTimeDelta"), _class2), _applyDecoratedDescriptor(_class2.prototype, "addOffset", [_dec17, _dec18, _dec19, _dec20, _dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "addOffset"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "setTime", [_dec23, _dec24, _dec25, _dec26, _dec27, _dec28], Object.getOwnPropertyDescriptor(_class2.prototype, "setTime"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getLeftSecond", [_dec29, _dec30, _dec31, _dec32], Object.getOwnPropertyDescriptor(_class2.prototype, "getLeftSecond"), _class2.prototype), _class2)) || _class) || _class) || _class) || _class) || _class);
|
|
169
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3RnZW5pZURzbCIsInJlcXVpcmUiLCJfZGVjIiwiX2RlYzIiLCJfZGVjMyIsIl9kZWM0IiwiX2RlYzUiLCJfZGVjNiIsIl9kZWM3IiwiX2RlYzgiLCJfZGVjOSIsIl9kZWMwIiwiX2RlYzEiLCJfZGVjMTAiLCJfZGVjMTEiLCJfZGVjMTIiLCJfZGVjMTMiLCJfZGVjMTQiLCJfZGVjMTUiLCJfZGVjMTYiLCJfZGVjMTciLCJfZGVjMTgiLCJfZGVjMTkiLCJfZGVjMjAiLCJfZGVjMjEiLCJfZGVjMjIiLCJfZGVjMjMiLCJfZGVjMjQiLCJfZGVjMjUiLCJfZGVjMjYiLCJfZGVjMjciLCJfZGVjMjgiLCJfZGVjMjkiLCJfZGVjMzAiLCJfZGVjMzEiLCJfZGVjMzIiLCJfY2xhc3MiLCJfY2xhc3MyIiwiX2Rlc2NyaXB0b3IiLCJfZGVzY3JpcHRvcjIiLCJfZGVzY3JpcHRvcjMiLCJfVGltZURlbHRhIiwiX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkiLCJlIiwiaSIsInIiLCJsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJ2YWx1ZSIsImluaXRpYWxpemVyIiwiY2FsbCIsIl9hcHBseURlY29yYXRlZERlc2NyaXB0b3IiLCJuIiwiYSIsImtleXMiLCJmb3JFYWNoIiwic2xpY2UiLCJyZXZlcnNlIiwicmVkdWNlIiwiX2luaXRpYWxpemVyV2FybmluZ0hlbHBlciIsIkVycm9yIiwiVGltZURlbHRhIiwiZXhwb3J0cyIsIkdlbmllQ2xhc3MiLCJSZWZsZWN0IiwibWV0YWRhdGEiLCJGdW5jdGlvbiIsImhvdXIiLCJ0eXBlIiwiTnVtYmVyIiwib3B0aW9uYWwiLCJtaW51dGUiLCJzZWNvbmQiLCJHZW5pZVByb3BlcnR5IiwiR2VuaWVGdW5jdGlvbiIsIkhlbHBlckNsYXNzIiwiY29uc3RydWN0b3IiLCJzZXR1cCIsImNvbXBhcmUiLCJiIiwiY29uc29sZSIsImxvZyIsImdldExlZnRTZWNvbmQiLCJDcmVhdGVUaW1lRGVsdGEiLCJDcmVhdGVPYmplY3QiLCJhZGRPZmZzZXQiLCJvZmZzZXR0aW1lIiwiTWF0aCIsImZsb29yIiwic2V0VGltZSIsInRvU3RyaW5nIiwiRXhhbXBsZXMiLCJ1c2VyX3V0dGVyYW5jZSIsImV4YW1wbGVfcGFyc2VkIiwicHJvdG90eXBlIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dlbmllL1RpbWVEZWx0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBHZW5pZUNsYXNzLFxuICBIZWxwZXJDbGFzcyxcbiAgR2VuaWVQcm9wZXJ0eSxcbiAgR2VuaWVGdW5jdGlvbixcbn0gZnJvbSBcIkBnYXJyaXg4Mi9yZWFjdGdlbmllLWRzbFwiO1xuaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuXG5AR2VuaWVDbGFzcyhcIkRlbHRhIHRpbWVcIilcbmV4cG9ydCBjbGFzcyBUaW1lRGVsdGEgZXh0ZW5kcyBIZWxwZXJDbGFzcyB7XG4gIEBHZW5pZVByb3BlcnR5KClcbiAgcHVibGljIGhvdXI6IG51bWJlcjtcbiAgQEdlbmllUHJvcGVydHkoKVxuICBwdWJsaWMgbWludXRlOiBudW1iZXI7XG4gIEBHZW5pZVByb3BlcnR5KClcbiAgcHVibGljIHNlY29uZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBob3VyID0gMCxcbiAgICBtaW51dGUgPSAwLFxuICAgIHNlY29uZCA9IDAsXG4gIH06IHtcbiAgICBob3VyPzogbnVtYmVyO1xuICAgIG1pbnV0ZT86IG51bWJlcjtcbiAgICBzZWNvbmQ/OiBudW1iZXI7XG4gIH0pIHtcbiAgICBzdXBlcih7fSk7XG4gICAgdGhpcy5ob3VyID0gaG91cjtcbiAgICB0aGlzLm1pbnV0ZSA9IG1pbnV0ZTtcbiAgICB0aGlzLnNlY29uZCA9IHNlY29uZDtcbiAgfVxuXG4gIHN0YXRpYyBzZXR1cCgpIHt9XG5cbiAgLy8gY3VzdG9tIGNvbXBhcmF0b3IgZm9yIHNvcnRpbmdcbiAgc3RhdGljIGNvbXBhcmUoYTogVGltZURlbHRhLCBiOiBUaW1lRGVsdGEpIHtcbiAgICBjb25zb2xlLmxvZyhhLmdldExlZnRTZWNvbmQoKSwgYi5nZXRMZWZ0U2Vjb25kKCkpO1xuICAgIHJldHVybiBhLmdldExlZnRTZWNvbmQoKSAtIGIuZ2V0TGVmdFNlY29uZCgpO1xuICB9XG5cbiAgQEdlbmllRnVuY3Rpb24oXCJDcmVhdGUgYSBuZXcgVGltZURlbHRhIG9iamVjdFwiKVxuICBzdGF0aWMgQ3JlYXRlVGltZURlbHRhKHtcbiAgICBob3VyID0gMCxcbiAgICBtaW51dGUgPSAwLFxuICAgIHNlY29uZCA9IDAsXG4gIH06IHtcbiAgICBob3VyPzogbnVtYmVyO1xuICAgIG1pbnV0ZT86IG51bWJlcjtcbiAgICBzZWNvbmQ/OiBudW1iZXI7XG4gIH0pOiBUaW1lRGVsdGEge1xuICAgIHJldHVybiBUaW1lRGVsdGEuQ3JlYXRlT2JqZWN0KHtcbiAgICAgIGhvdXI6IGhvdXIsXG4gICAgICBtaW51dGU6IG1pbnV0ZSxcbiAgICAgIHNlY29uZDogc2Vjb25kLFxuICAgIH0pO1xuICB9XG5cbiAgQEdlbmllRnVuY3Rpb24oXCJBZGQgYSBvZmZzZXQgdG8gdGhlIHRpbWVcIilcbiAgYWRkT2Zmc2V0KHtcbiAgICBob3VyID0gMCxcbiAgICBtaW51dGUgPSAwLFxuICAgIHNlY29uZCA9IDAsXG4gIH06IHtcbiAgICBob3VyPzogbnVtYmVyO1xuICAgIG1pbnV0ZT86IG51bWJlcjtcbiAgICBzZWNvbmQ/OiBudW1iZXI7XG4gIH0pOiB2b2lkIHtcbiAgICBjb25zdCBvZmZzZXR0aW1lID1cbiAgICAgIHRoaXMuZ2V0TGVmdFNlY29uZCgpICsgaG91ciAqIDM2MDAgKyBtaW51dGUgKiA2MCArIHNlY29uZDtcbiAgICBpZiAob2Zmc2V0dGltZSA8IDApIHtcbiAgICAgIHRoaXMuaG91ciA9IDA7XG4gICAgICB0aGlzLm1pbnV0ZSA9IDA7XG4gICAgICB0aGlzLnNlY29uZCA9IDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaG91ciA9IE1hdGguZmxvb3Iob2Zmc2V0dGltZSAvIDM2MDApO1xuICAgIHRoaXMubWludXRlID0gTWF0aC5mbG9vcigob2Zmc2V0dGltZSAlIDM2MDApIC8gNjApO1xuICAgIHRoaXMuc2Vjb25kID0gb2Zmc2V0dGltZSAlIDYwO1xuICB9XG5cbiAgQEdlbmllRnVuY3Rpb24oXCJTZXQgdGhlIHZhbHVlIHRvIHRoZSB0aW1lXCIpXG4gIHNldFRpbWUoe1xuICAgIGhvdXIgPSAwLFxuICAgIG1pbnV0ZSA9IDAsXG4gICAgc2Vjb25kID0gMCxcbiAgfToge1xuICAgIGhvdXI/OiBudW1iZXI7XG4gICAgbWludXRlPzogbnVtYmVyO1xuICAgIHNlY29uZD86IG51bWJlcjtcbiAgfSk6IHZvaWQge1xuICAgIHRoaXMuaG91ciA9IGhvdXI7XG4gICAgdGhpcy5taW51dGUgPSBtaW51dGU7XG4gICAgdGhpcy5zZWNvbmQgPSBzZWNvbmQ7XG4gIH1cblxuICBAR2VuaWVGdW5jdGlvbihcIkdldCB0aGUgc2Vjb25kIG9mIHRoZSBUaW1lRGVsdGEgb2JqZWN0XCIpXG4gIGdldExlZnRTZWNvbmQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWNvbmQgKyB0aGlzLm1pbnV0ZSAqIDYwICsgdGhpcy5ob3VyICogMzYwMDtcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmhvdXJ9OiR7dGhpcy5taW51dGV9OiR7dGhpcy5zZWNvbmR9YDtcbiAgfVxuXG4gIHN0YXRpYyBFeGFtcGxlcyA9IFtcbiAgICB7XG4gICAgICB1c2VyX3V0dGVyYW5jZTogXCIyMCBtaW51dGVzIGxhdGVyXCIsXG4gICAgICBleGFtcGxlX3BhcnNlZDogXCJUaW1lRGVsdGEuQ3JlYXRlT2JqZWN0KG1pbnV0ZTogMjApXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICB1c2VyX3V0dGVyYW5jZTogXCIxaG91ciBsYXRlclwiLFxuICAgICAgZXhhbXBsZV9wYXJzZWQ6IFwiVGltZURlbHRhLkNyZWF0ZU9iamVjdChob3VyOiAxKVwiLFxuICAgIH0sXG4gICAge1xuICAgICAgdXNlcl91dHRlcmFuY2U6IFwiMWhvdXIgMjAgbWludXRlcyBsYXRlclwiLFxuICAgICAgZXhhbXBsZV9wYXJzZWQ6IFwiVGltZURlbHRhLkNyZWF0ZU9iamVjdChob3VyOiAxLCBtaW51dGU6IDIwKVwiLFxuICAgIH0sXG4gIF07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLGNBQUEsR0FBQUMsT0FBQTtBQU1BQSxPQUFBO0FBQTBCLElBQUFDLElBQUEsRUFBQUMsS0FBQSxFQUFBQyxLQUFBLEVBQUFDLEtBQUEsRUFBQUMsS0FBQSxFQUFBQyxLQUFBLEVBQUFDLEtBQUEsRUFBQUMsS0FBQSxFQUFBQyxLQUFBLEVBQUFDLEtBQUEsRUFBQUMsS0FBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxNQUFBLEVBQUFDLE1BQUEsRUFBQUMsTUFBQSxFQUFBQyxPQUFBLEVBQUFDLFdBQUEsRUFBQUMsWUFBQSxFQUFBQyxZQUFBLEVBQUFDLFVBQUE7QUFBQSxTQUFBQywyQkFBQUMsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxJQUFBRCxDQUFBLElBQUFFLE1BQUEsQ0FBQUMsY0FBQSxDQUFBTCxDQUFBLEVBQUFDLENBQUEsSUFBQUssVUFBQSxFQUFBSixDQUFBLENBQUFJLFVBQUEsRUFBQUMsWUFBQSxFQUFBTCxDQUFBLENBQUFLLFlBQUEsRUFBQUMsUUFBQSxFQUFBTixD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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const GenieViewWrapper: (className: string, childComponent: any, childParams: any[]) => () => any;
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.GenieViewWrapper = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _reactNative = require("react-native");
|
|
9
|
+
var _reactDecorators = require("./react-decorators");
|
|
10
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
11
|
+
const FallbackNavigationContext = /*#__PURE__*/_react.default.createContext(undefined);
|
|
12
|
+
let MaybeNavigationContext = FallbackNavigationContext;
|
|
13
|
+
try {
|
|
14
|
+
const reactNavigation = require("@react-navigation/native");
|
|
15
|
+
if (reactNavigation?.NavigationContext) {
|
|
16
|
+
MaybeNavigationContext = reactNavigation.NavigationContext;
|
|
17
|
+
}
|
|
18
|
+
} catch {
|
|
19
|
+
MaybeNavigationContext = FallbackNavigationContext;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Cross-platform GenieViewWrapper using React Native primitives.
|
|
24
|
+
* Works on web, iOS, and Android.
|
|
25
|
+
*
|
|
26
|
+
* Uses:
|
|
27
|
+
* - View instead of div
|
|
28
|
+
* - onLayout for tracking component bounds
|
|
29
|
+
* - Platform-specific visibility detection
|
|
30
|
+
*/
|
|
31
|
+
const GenieViewWrapper = (className, childComponent, childParams) => () => {
|
|
32
|
+
const interfaceId = (0, _react.useMemo)(() => Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15), []);
|
|
33
|
+
const viewRef = (0, _react.useRef)(null);
|
|
34
|
+
const [layout, setLayout] = (0, _react.useState)({
|
|
35
|
+
x: 0,
|
|
36
|
+
y: 0,
|
|
37
|
+
width: 0,
|
|
38
|
+
height: 0
|
|
39
|
+
});
|
|
40
|
+
const layoutRef = (0, _react.useRef)(layout);
|
|
41
|
+
const [isVisible, setIsVisible] = (0, _react.useState)(true); // Assume visible on native
|
|
42
|
+
const isVisibleRef = (0, _react.useRef)(true); // Keep a ref to the latest value
|
|
43
|
+
const keyRef = (0, _react.useRef)(childParams[0]);
|
|
44
|
+
const navigation = _react.default.useContext(MaybeNavigationContext);
|
|
45
|
+
const [isFocusedScreen, setIsFocusedScreen] = (0, _react.useState)(() => {
|
|
46
|
+
if (_reactNative.Platform.OS === "web") {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
if (!navigation || typeof navigation.isFocused !== "function") {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
return !!navigation.isFocused();
|
|
53
|
+
});
|
|
54
|
+
const isScreenViewWrapper = (0, _react.useMemo)(() => {
|
|
55
|
+
const componentName = childComponent?.name ?? "";
|
|
56
|
+
return /View$/.test(componentName);
|
|
57
|
+
}, [childComponent]);
|
|
58
|
+
(0, _react.useEffect)(() => {
|
|
59
|
+
if (_reactNative.Platform.OS === "web") {
|
|
60
|
+
setIsFocusedScreen(true);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (!navigation || typeof navigation.isFocused !== "function") {
|
|
64
|
+
setIsFocusedScreen(undefined);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
setIsFocusedScreen(!!navigation.isFocused());
|
|
68
|
+
const focusUnsubscribe = typeof navigation.addListener === "function" ? navigation.addListener("focus", () => setIsFocusedScreen(true)) : undefined;
|
|
69
|
+
const blurUnsubscribe = typeof navigation.addListener === "function" ? navigation.addListener("blur", () => setIsFocusedScreen(false)) : undefined;
|
|
70
|
+
return () => {
|
|
71
|
+
focusUnsubscribe?.();
|
|
72
|
+
blurUnsubscribe?.();
|
|
73
|
+
};
|
|
74
|
+
}, [navigation]);
|
|
75
|
+
(0, _react.useEffect)(() => {
|
|
76
|
+
isVisibleRef.current = isVisible;
|
|
77
|
+
}, [isVisible]);
|
|
78
|
+
(0, _react.useEffect)(() => {
|
|
79
|
+
layoutRef.current = layout;
|
|
80
|
+
}, [layout]);
|
|
81
|
+
const isRectInViewport = (0, _react.useCallback)(rect => {
|
|
82
|
+
if (rect.width <= 0 || rect.height <= 0) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
let viewportWidth = 0;
|
|
86
|
+
let viewportHeight = 0;
|
|
87
|
+
if (typeof window !== "undefined" && typeof window.innerWidth === "number" && typeof window.innerHeight === "number") {
|
|
88
|
+
viewportWidth = window.innerWidth;
|
|
89
|
+
viewportHeight = window.innerHeight;
|
|
90
|
+
} else {
|
|
91
|
+
const viewport = _reactNative.Dimensions.get("window");
|
|
92
|
+
viewportWidth = viewport.width;
|
|
93
|
+
viewportHeight = viewport.height;
|
|
94
|
+
}
|
|
95
|
+
const right = rect.x + rect.width;
|
|
96
|
+
const bottom = rect.y + rect.height;
|
|
97
|
+
return right > 0 && bottom > 0 && rect.x < viewportWidth && rect.y < viewportHeight;
|
|
98
|
+
}, []);
|
|
99
|
+
const registerRect = (0, _react.useCallback)((rect, visible = isVisibleRef.current) => {
|
|
100
|
+
const hasMeasuredSize = rect.width > 0 && rect.height > 0;
|
|
101
|
+
if (!visible || hasMeasuredSize && !isRectInViewport(rect)) {
|
|
102
|
+
delete _reactDecorators.AllGenieDisplayedInstances[interfaceId];
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
_reactDecorators.AllGenieDisplayedInstances[interfaceId] = () => ({
|
|
106
|
+
className: className,
|
|
107
|
+
key: keyRef.current,
|
|
108
|
+
isFocusedScreen,
|
|
109
|
+
rect: {
|
|
110
|
+
x: rect.x,
|
|
111
|
+
y: rect.y,
|
|
112
|
+
width: rect.width,
|
|
113
|
+
height: rect.height,
|
|
114
|
+
top: rect.y,
|
|
115
|
+
left: rect.x,
|
|
116
|
+
bottom: rect.y + rect.height,
|
|
117
|
+
right: rect.x + rect.width
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}, [className, interfaceId, isFocusedScreen, isRectInViewport]);
|
|
121
|
+
const updateRectFromCurrentNode = (0, _react.useCallback)((fallbackRect, preferredRect) => {
|
|
122
|
+
if (_reactNative.Platform.OS === "web") {
|
|
123
|
+
if (preferredRect) {
|
|
124
|
+
layoutRef.current = preferredRect;
|
|
125
|
+
registerRect(preferredRect);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const webNode = viewRef.current;
|
|
129
|
+
if (webNode?.getBoundingClientRect) {
|
|
130
|
+
const domRect = webNode.getBoundingClientRect();
|
|
131
|
+
const measuredRect = {
|
|
132
|
+
x: domRect.left,
|
|
133
|
+
y: domRect.top,
|
|
134
|
+
width: domRect.width,
|
|
135
|
+
height: domRect.height
|
|
136
|
+
};
|
|
137
|
+
layoutRef.current = measuredRect;
|
|
138
|
+
registerRect(measuredRect);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (webNode?.measure) {
|
|
142
|
+
webNode.measure((_x, _y, width, height, pageX, pageY) => {
|
|
143
|
+
const measuredRect = {
|
|
144
|
+
x: pageX ?? fallbackRect?.x ?? 0,
|
|
145
|
+
y: pageY ?? fallbackRect?.y ?? 0,
|
|
146
|
+
width: width ?? fallbackRect?.width ?? 0,
|
|
147
|
+
height: height ?? fallbackRect?.height ?? 0
|
|
148
|
+
};
|
|
149
|
+
layoutRef.current = measuredRect;
|
|
150
|
+
registerRect(measuredRect);
|
|
151
|
+
});
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (webNode?.measureInWindow) {
|
|
155
|
+
webNode.measureInWindow((x, y, width, height) => {
|
|
156
|
+
const measuredRect = {
|
|
157
|
+
x: x ?? fallbackRect?.x ?? 0,
|
|
158
|
+
y: y ?? fallbackRect?.y ?? 0,
|
|
159
|
+
width: width ?? fallbackRect?.width ?? 0,
|
|
160
|
+
height: height ?? fallbackRect?.height ?? 0
|
|
161
|
+
};
|
|
162
|
+
layoutRef.current = measuredRect;
|
|
163
|
+
registerRect(measuredRect);
|
|
164
|
+
});
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
if (fallbackRect) {
|
|
168
|
+
layoutRef.current = fallbackRect;
|
|
169
|
+
registerRect(fallbackRect);
|
|
170
|
+
}
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const nativeNode = viewRef.current;
|
|
174
|
+
if (nativeNode?.measure) {
|
|
175
|
+
nativeNode.measure((_x, _y, width, height, pageX, pageY) => {
|
|
176
|
+
const measuredRect = {
|
|
177
|
+
x: pageX ?? 0,
|
|
178
|
+
y: pageY ?? 0,
|
|
179
|
+
width: width ?? fallbackRect?.width ?? 0,
|
|
180
|
+
height: height ?? fallbackRect?.height ?? 0
|
|
181
|
+
};
|
|
182
|
+
layoutRef.current = measuredRect;
|
|
183
|
+
registerRect(measuredRect);
|
|
184
|
+
});
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (nativeNode?.measureInWindow) {
|
|
188
|
+
nativeNode.measureInWindow((x, y, width, height) => {
|
|
189
|
+
const measuredRect = {
|
|
190
|
+
x: x ?? 0,
|
|
191
|
+
y: y ?? 0,
|
|
192
|
+
width: width ?? 0,
|
|
193
|
+
height: height ?? 0
|
|
194
|
+
};
|
|
195
|
+
layoutRef.current = measuredRect;
|
|
196
|
+
registerRect(measuredRect);
|
|
197
|
+
});
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (fallbackRect) {
|
|
201
|
+
layoutRef.current = fallbackRect;
|
|
202
|
+
registerRect(fallbackRect);
|
|
203
|
+
}
|
|
204
|
+
}, [registerRect]);
|
|
205
|
+
const updateRectFromNativeEventTarget = (0, _react.useCallback)((targetTag, fallbackRect) => {
|
|
206
|
+
if (_reactNative.Platform.OS === "web" || typeof targetTag !== "number") {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const nativeUiManager = _reactNative.UIManager;
|
|
210
|
+
if (typeof nativeUiManager?.measure === "function") {
|
|
211
|
+
nativeUiManager.measure(targetTag, (x, y, width, height, pageX, pageY) => {
|
|
212
|
+
const measuredRect = {
|
|
213
|
+
x: pageX ?? x ?? fallbackRect?.x ?? 0,
|
|
214
|
+
y: pageY ?? y ?? fallbackRect?.y ?? 0,
|
|
215
|
+
width: width ?? fallbackRect?.width ?? 0,
|
|
216
|
+
height: height ?? fallbackRect?.height ?? 0
|
|
217
|
+
};
|
|
218
|
+
layoutRef.current = measuredRect;
|
|
219
|
+
registerRect(measuredRect);
|
|
220
|
+
});
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (typeof nativeUiManager?.measureInWindow === "function") {
|
|
224
|
+
nativeUiManager.measureInWindow(targetTag, (x, y, width, height) => {
|
|
225
|
+
const measuredRect = {
|
|
226
|
+
x: x ?? fallbackRect?.x ?? 0,
|
|
227
|
+
y: y ?? fallbackRect?.y ?? 0,
|
|
228
|
+
width: width ?? fallbackRect?.width ?? 0,
|
|
229
|
+
height: height ?? fallbackRect?.height ?? 0
|
|
230
|
+
};
|
|
231
|
+
layoutRef.current = measuredRect;
|
|
232
|
+
registerRect(measuredRect);
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}, [registerRect]);
|
|
236
|
+
const getWebEventRect = (0, _react.useCallback)(event => {
|
|
237
|
+
const webTarget = event.currentTarget ?? event.target ?? event.nativeEvent?.target;
|
|
238
|
+
if (webTarget?.getBoundingClientRect) {
|
|
239
|
+
const domRect = webTarget.getBoundingClientRect();
|
|
240
|
+
return {
|
|
241
|
+
x: domRect.left,
|
|
242
|
+
y: domRect.top,
|
|
243
|
+
width: domRect.width,
|
|
244
|
+
height: domRect.height
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
return undefined;
|
|
248
|
+
}, []);
|
|
249
|
+
(0, _react.useEffect)(() => {
|
|
250
|
+
keyRef.current = childParams[0];
|
|
251
|
+
if (isVisibleRef.current) {
|
|
252
|
+
registerRect(layoutRef.current);
|
|
253
|
+
}
|
|
254
|
+
}, [childParams, registerRect]);
|
|
255
|
+
(0, _react.useEffect)(() => {
|
|
256
|
+
// console.log(`GenieViewWrapper: ${className} ${interfaceId} created`);
|
|
257
|
+
|
|
258
|
+
// Mark as visible on mount (for native platforms where all rendered components are considered "visible")
|
|
259
|
+
registerRect(layoutRef.current);
|
|
260
|
+
|
|
261
|
+
// For web platform, use IntersectionObserver if available
|
|
262
|
+
if (_reactNative.Platform.OS === 'web' && typeof IntersectionObserver !== 'undefined') {
|
|
263
|
+
const observer = new IntersectionObserver(entries => {
|
|
264
|
+
const [entry] = entries;
|
|
265
|
+
const visible = entry.isIntersecting;
|
|
266
|
+
console.log(`GenieViewWrapper: ${className} ${interfaceId} ${visible}`);
|
|
267
|
+
setIsVisible(visible);
|
|
268
|
+
if (!visible) {
|
|
269
|
+
delete _reactDecorators.AllGenieDisplayedInstances[interfaceId];
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const entryRect = entry.boundingClientRect ? {
|
|
273
|
+
x: entry.boundingClientRect.left,
|
|
274
|
+
y: entry.boundingClientRect.top,
|
|
275
|
+
width: entry.boundingClientRect.width,
|
|
276
|
+
height: entry.boundingClientRect.height
|
|
277
|
+
} : undefined;
|
|
278
|
+
updateRectFromCurrentNode(layoutRef.current, entryRect);
|
|
279
|
+
}, {
|
|
280
|
+
threshold: 0.1
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
// For web, viewRef.current is the DOM node
|
|
284
|
+
if (viewRef.current) {
|
|
285
|
+
observer.observe(viewRef.current);
|
|
286
|
+
}
|
|
287
|
+
return () => {
|
|
288
|
+
observer.disconnect();
|
|
289
|
+
console.log(`GenieViewWrapper: ${className} ${interfaceId} destroyed`);
|
|
290
|
+
delete _reactDecorators.AllGenieDisplayedInstances[interfaceId];
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Cleanup for native platforms
|
|
295
|
+
return () => {
|
|
296
|
+
console.log(`GenieViewWrapper: ${className} ${interfaceId} destroyed`);
|
|
297
|
+
delete _reactDecorators.AllGenieDisplayedInstances[interfaceId];
|
|
298
|
+
};
|
|
299
|
+
}, [className, interfaceId, registerRect, updateRectFromCurrentNode]);
|
|
300
|
+
(0, _react.useEffect)(() => {
|
|
301
|
+
// Expose a live re-measure hook so tap capture can refresh cached bounds
|
|
302
|
+
// without forcing the wrapper to remount.
|
|
303
|
+
_reactDecorators.AllGenieDisplayedInstanceRefreshers[interfaceId] = () => {
|
|
304
|
+
if (!isVisibleRef.current) {
|
|
305
|
+
delete _reactDecorators.AllGenieDisplayedInstances[interfaceId];
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
updateRectFromCurrentNode(layoutRef.current);
|
|
309
|
+
};
|
|
310
|
+
return () => {
|
|
311
|
+
delete _reactDecorators.AllGenieDisplayedInstanceRefreshers[interfaceId];
|
|
312
|
+
};
|
|
313
|
+
}, [interfaceId, updateRectFromCurrentNode]);
|
|
314
|
+
const handleLayout = (0, _react.useCallback)(event => {
|
|
315
|
+
const {
|
|
316
|
+
x,
|
|
317
|
+
y,
|
|
318
|
+
width,
|
|
319
|
+
height
|
|
320
|
+
} = event.nativeEvent.layout;
|
|
321
|
+
const newLayout = {
|
|
322
|
+
x,
|
|
323
|
+
y,
|
|
324
|
+
width,
|
|
325
|
+
height
|
|
326
|
+
};
|
|
327
|
+
setLayout(newLayout);
|
|
328
|
+
layoutRef.current = newLayout; // Update ref immediately
|
|
329
|
+
|
|
330
|
+
if (_reactNative.Platform.OS === "web") {
|
|
331
|
+
const webRect = getWebEventRect(event);
|
|
332
|
+
updateRectFromCurrentNode(newLayout, webRect);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
updateRectFromCurrentNode(newLayout);
|
|
336
|
+
updateRectFromNativeEventTarget(event.nativeEvent?.target, newLayout);
|
|
337
|
+
}, [getWebEventRect, updateRectFromCurrentNode, updateRectFromNativeEventTarget]);
|
|
338
|
+
return /*#__PURE__*/_react.default.createElement(_reactNative.View
|
|
339
|
+
// @ts-ignore - ref works differently on web vs native
|
|
340
|
+
, {
|
|
341
|
+
ref: viewRef,
|
|
342
|
+
style: _reactNative.Platform.OS === "web" ? isScreenViewWrapper ? styles.webScreenContainer : styles.webInlineContainer : isScreenViewWrapper ? styles.nativeScreenContainer : styles.nativeInlineContainer,
|
|
343
|
+
onLayout: handleLayout,
|
|
344
|
+
collapsable: false,
|
|
345
|
+
testID: "genie-wrapper"
|
|
346
|
+
}, childComponent(...childParams));
|
|
347
|
+
};
|
|
348
|
+
exports.GenieViewWrapper = GenieViewWrapper;
|
|
349
|
+
const styles = _reactNative.StyleSheet.create({
|
|
350
|
+
webScreenContainer: {
|
|
351
|
+
// Screen-level wrappers on web need growth so short screens still fill the
|
|
352
|
+
// viewport instead of collapsing to content height.
|
|
353
|
+
flexGrow: 1,
|
|
354
|
+
flexShrink: 1,
|
|
355
|
+
minHeight: 0,
|
|
356
|
+
minWidth: 0
|
|
357
|
+
},
|
|
358
|
+
webInlineContainer: {
|
|
359
|
+
// Inline wrappers should remain measurable without forcing layout growth.
|
|
360
|
+
flexShrink: 1,
|
|
361
|
+
minHeight: 0,
|
|
362
|
+
minWidth: 0
|
|
363
|
+
},
|
|
364
|
+
nativeScreenContainer: {
|
|
365
|
+
// Screen-level wrappers need growth to avoid collapsing flex:1 children.
|
|
366
|
+
flexGrow: 1,
|
|
367
|
+
flexShrink: 1,
|
|
368
|
+
minHeight: 0,
|
|
369
|
+
minWidth: 0
|
|
370
|
+
},
|
|
371
|
+
nativeInlineContainer: {
|
|
372
|
+
// Keep inline wrappers measurable without forcing screen-level growth.
|
|
373
|
+
minHeight: 0,
|
|
374
|
+
minWidth: 0
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3ROYXRpdmUiLCJfcmVhY3REZWNvcmF0b3JzIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiZGVmYXVsdCIsImhhcyIsImdldCIsInNldCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiRmFsbGJhY2tOYXZpZ2F0aW9uQ29udGV4dCIsIlJlYWN0IiwiY3JlYXRlQ29udGV4dCIsInVuZGVmaW5lZCIsIk1heWJlTmF2aWdhdGlvbkNvbnRleHQiLCJyZWFjdE5hdmlnYXRpb24iLCJOYXZpZ2F0aW9uQ29udGV4dCIsIkdlbmllVmlld1dyYXBwZXIiLCJjbGFzc05hbWUiLCJjaGlsZENvbXBvbmVudCIsImNoaWxkUGFyYW1zIiwiaW50ZXJmYWNlSWQiLCJ1c2VNZW1vIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwic3Vic3RyaW5nIiwidmlld1JlZiIsInVzZVJlZiIsImxheW91dCIsInNldExheW91dCIsInVzZVN0YXRlIiwieCIsInkiLCJ3aWR0aCIsImhlaWdodCIsImxheW91dFJlZiIsImlzVmlzaWJsZSIsInNldElzVmlzaWJsZSIsImlzVmlzaWJsZVJlZiIsImtleVJlZiIsIm5hdmlnYXRpb24iLCJ1c2VDb250ZXh0IiwiaXNGb2N1c2VkU2NyZWVuIiwic2V0SXNGb2N1c2VkU2NyZWVuIiwiUGxhdGZvcm0iLCJPUyIsImlzRm9jdXNlZCIsImlzU2NyZWVuVmlld1dyYXBwZXIiLCJjb21wb25lbnROYW1lIiwibmFtZSIsInRlc3QiLCJ1c2VFZmZlY3QiLCJmb2N1c1Vuc3Vic2NyaWJlIiwiYWRkTGlzdGVuZXIiLCJibHVyVW5zdWJzY3JpYmUiLCJjdXJyZW50IiwiaXNSZWN0SW5WaWV3cG9ydCIsInVzZUNhbGxiYWNrIiwicmVjdCIsInZpZXdwb3J0V2lkdGgiLCJ2aWV3cG9ydEhlaWdodCIsIndpbmRvdyIsImlubmVyV2lkdGgiLCJpbm5lckhlaWdodCIsInZpZXdwb3J0IiwiRGltZW5zaW9ucyIsInJpZ2h0IiwiYm90dG9tIiwicmVnaXN0ZXJSZWN0IiwidmlzaWJsZSIsImhhc01lYXN1cmVkU2l6ZSIsIkFsbEdlbmllRGlzcGxheWVkSW5zdGFuY2VzIiwia2V5IiwidG9wIiwibGVmdCIsInVwZGF0ZVJlY3RGcm9tQ3VycmVudE5vZGUiLCJmYWxsYmFja1JlY3QiLCJwcmVmZXJyZWRSZWN0Iiwid2ViTm9kZSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImRvbVJlY3QiLCJtZWFzdXJlZFJlY3QiLCJtZWFzdXJlIiwiX3giLCJfeSIsInBhZ2VYIiwicGFnZVkiLCJtZWFzdXJlSW5XaW5kb3ciLCJuYXRpdmVOb2RlIiwidXBkYXRlUmVjdEZyb21OYXRpdmVFdmVudFRhcmdldCIsInRhcmdldFRhZyIsIm5hdGl2ZVVpTWFuYWdlciIsIlVJTWFuYWdlciIsImdldFdlYkV2ZW50UmVjdCIsImV2ZW50Iiwid2ViVGFyZ2V0IiwiY3VycmVudFRhcmdldCIsInRhcmdldCIsIm5hdGl2ZUV2ZW50IiwiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLCJvYnNlcnZlciIsImVudHJpZXMiLCJlbnRyeSIsImlzSW50ZXJzZWN0aW5nIiwiY29uc29sZSIsImxvZyIsImVudHJ5UmVjdCIsImJvdW5kaW5nQ2xpZW50UmVjdCIsInRocmVzaG9sZCIsIm9ic2VydmUiLCJkaXNjb25uZWN0IiwiQWxsR2VuaWVEaXNwbGF5ZWRJbnN0YW5jZVJlZnJlc2hlcnMiLCJoYW5kbGVMYXlvdXQiLCJuZXdMYXlvdXQiLCJ3ZWJSZWN0IiwiY3JlYXRlRWxlbWVudCIsIlZpZXciLCJyZWYiLCJzdHlsZSIsInN0eWxlcyIsIndlYlNjcmVlbkNvbnRhaW5lciIsIndlYklubGluZUNvbnRhaW5lciIsIm5hdGl2ZVNjcmVlbkNvbnRhaW5lciIsIm5hdGl2ZUlubGluZUNvbnRhaW5lciIsIm9uTGF5b3V0IiwiY29sbGFwc2FibGUiLCJ0ZXN0SUQiLCJleHBvcnRzIiwiU3R5bGVTaGVldCIsImNyZWF0ZSIsImZsZXhHcm93IiwiZmxleFNocmluayIsIm1pbkhlaWdodCIsIm1pbldpZHRoIl0sInNvdXJjZXMiOlsiLi4vc3JjL2dlbmllLXZpZXctd3JhcHBlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFZpZXcsIFBsYXRmb3JtLCBTdHlsZVNoZWV0LCBMYXlvdXRDaGFuZ2VFdmVudCwgRGltZW5zaW9ucywgVUlNYW5hZ2VyIH0gZnJvbSBcInJlYWN0LW5hdGl2ZVwiO1xuaW1wb3J0IHtcbiAgQWxsR2VuaWVEaXNwbGF5ZWRJbnN0YW5jZVJlZnJlc2hlcnMsXG4gIEFsbEdlbmllRGlzcGxheWVkSW5zdGFuY2VzLFxufSBmcm9tIFwiLi9yZWFjdC1kZWNvcmF0b3JzXCI7XG5cbmNvbnN0IEZhbGxiYWNrTmF2aWdhdGlvbkNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0PGFueT4odW5kZWZpbmVkKTtcbmxldCBNYXliZU5hdmlnYXRpb25Db250ZXh0OiBSZWFjdC5Db250ZXh0PGFueT4gPSBGYWxsYmFja05hdmlnYXRpb25Db250ZXh0O1xuXG50cnkge1xuICBjb25zdCByZWFjdE5hdmlnYXRpb24gPSByZXF1aXJlKFwiQHJlYWN0LW5hdmlnYXRpb24vbmF0aXZlXCIpO1xuICBpZiAocmVhY3ROYXZpZ2F0aW9uPy5OYXZpZ2F0aW9uQ29udGV4dCkge1xuICAgIE1heWJlTmF2aWdhdGlvbkNvbnRleHQgPSByZWFjdE5hdmlnYXRpb24uTmF2aWdhdGlvbkNvbnRleHQ7XG4gIH1cbn0gY2F0Y2gge1xuICBNYXliZU5hdmlnYXRpb25Db250ZXh0ID0gRmFsbGJhY2tOYXZpZ2F0aW9uQ29udGV4dDtcbn1cblxuLyoqXG4gKiBDcm9zcy1wbGF0Zm9ybSBHZW5pZVZpZXdXcmFwcGVyIHVzaW5nIFJlYWN0IE5hdGl2ZSBwcmltaXRpdmVzLlxuICogV29ya3Mgb24gd2ViLCBpT1MsIGFuZCBBbmRyb2lkLlxuICogXG4gKiBVc2VzOlxuICogLSBWaWV3IGluc3RlYWQgb2YgZGl2XG4gKiAtIG9uTGF5b3V0IGZvciB0cmFja2luZyBjb21wb25lbnQgYm91bmRzXG4gKiAtIFBsYXRmb3JtLXNwZWNpZmljIHZpc2liaWxpdHkgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZVZpZXdXcmFwcGVyID1cbiAgKGNsYXNzTmFtZTogc3RyaW5nLCBjaGlsZENvbXBvbmVudDogYW55LCBjaGlsZFBhcmFtczogYW55W10pID0+ICgpID0+IHtcbiAgICBjb25zdCBpbnRlcmZhY2VJZCA9IHVzZU1lbW8oXG4gICAgICAoKSA9PlxuICAgICAgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDE1KSArXG4gICAgICBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgMTUpLFxuICAgICAgW10sXG4gICAgKTtcbiAgICBcbiAgICBjb25zdCB2aWV3UmVmID0gdXNlUmVmPGFueT4obnVsbCk7XG4gICAgY29uc3QgW2xheW91dCwgc2V0TGF5b3V0XSA9IHVzZVN0YXRlKHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9KTtcbiAgICBjb25zdCBsYXlvdXRSZWYgPSB1c2VSZWYobGF5b3V0KTtcbiAgICBjb25zdCBbaXNWaXNpYmxlLCBzZXRJc1Zpc2libGVdID0gdXNlU3RhdGUodHJ1ZSk7IC8vIEFzc3VtZSB2aXNpYmxlIG9uIG5hdGl2ZVxuICAgIGNvbnN0IGlzVmlzaWJsZVJlZiA9IHVzZVJlZih0cnVlKTsgLy8gS2VlcCBhIHJlZiB0byB0aGUgbGF0ZXN0IHZhbHVlXG4gICAgY29uc3Qga2V5UmVmID0gdXNlUmVmPGFueT4oY2hpbGRQYXJhbXNbMF0pO1xuICAgIGNvbnN0IG5hdmlnYXRpb24gPSBSZWFjdC51c2VDb250ZXh0KE1heWJlTmF2aWdhdGlvbkNvbnRleHQpO1xuICAgIGNvbnN0IFtpc0ZvY3VzZWRTY3JlZW4sIHNldElzRm9jdXNlZFNjcmVlbl0gPSB1c2VTdGF0ZTxib29sZWFuIHwgdW5kZWZpbmVkPigoKSA9PiB7XG4gICAgICBpZiAoUGxhdGZvcm0uT1MgPT09IFwid2ViXCIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoIW5hdmlnYXRpb24gfHwgdHlwZW9mIG5hdmlnYXRpb24uaXNGb2N1c2VkICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhIW5hdmlnYXRpb24uaXNGb2N1c2VkKCk7XG4gICAgfSk7XG4gICAgY29uc3QgaXNTY3JlZW5WaWV3V3JhcHBlciA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNoaWxkQ29tcG9uZW50Py5uYW1lID8/IFwiXCI7XG4gICAgICByZXR1cm4gL1ZpZXckLy50ZXN0KGNvbXBvbmVudE5hbWUpO1xuICAgIH0sIFtjaGlsZENvbXBvbmVudF0pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmIChQbGF0Zm9ybS5PUyA9PT0gXCJ3ZWJcIikge1xuICAgICAgICBzZXRJc0ZvY3VzZWRTY3JlZW4odHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFuYXZpZ2F0aW9uIHx8IHR5cGVvZiBuYXZpZ2F0aW9uLmlzRm9jdXNlZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHNldElzRm9jdXNlZFNjcmVlbih1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldElzRm9jdXNlZFNjcmVlbighIW5hdmlnYXRpb24uaXNGb2N1c2VkKCkpO1xuXG4gICAgICBjb25zdCBmb2N1c1Vuc3Vic2NyaWJlID1cbiAgICAgICAgdHlwZW9mIG5hdmlnYXRpb24uYWRkTGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gbmF2aWdhdGlvbi5hZGRMaXN0ZW5lcihcImZvY3VzXCIsICgpID0+IHNldElzRm9jdXNlZFNjcmVlbih0cnVlKSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGJsdXJVbnN1YnNjcmliZSA9XG4gICAgICAgIHR5cGVvZiBuYXZpZ2F0aW9uLmFkZExpc3RlbmVyID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IG5hdmlnYXRpb24uYWRkTGlzdGVuZXIoXCJibHVyXCIsICgpID0+IHNldElzRm9jdXNlZFNjcmVlbihmYWxzZSkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGZvY3VzVW5zdWJzY3JpYmU/LigpO1xuICAgICAgICBibHVyVW5zdWJzY3JpYmU/LigpO1xuICAgICAgfTtcbiAgICB9LCBbbmF2aWdhdGlvbl0pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlzVmlzaWJsZVJlZi5jdXJyZW50ID0gaXNWaXNpYmxlO1xuICAgIH0sIFtpc1Zpc2libGVdKTtcbiAgICBcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgbGF5b3V0UmVmLmN1cnJlbnQgPSBsYXlvdXQ7XG4gICAgfSwgW2xheW91dF0pO1xuXG4gICAgY29uc3QgaXNSZWN0SW5WaWV3cG9ydCA9IHVzZUNhbGxiYWNrKChyZWN0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9KSA9PiB7XG4gICAgICBpZiAocmVjdC53aWR0aCA8PSAwIHx8IHJlY3QuaGVpZ2h0IDw9IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsZXQgdmlld3BvcnRXaWR0aCA9IDA7XG4gICAgICBsZXQgdmlld3BvcnRIZWlnaHQgPSAwO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIHdpbmRvdy5pbm5lcldpZHRoID09PSBcIm51bWJlclwiICYmXG4gICAgICAgIHR5cGVvZiB3aW5kb3cuaW5uZXJIZWlnaHQgPT09IFwibnVtYmVyXCJcbiAgICAgICkge1xuICAgICAgICB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgIHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSBEaW1lbnNpb25zLmdldChcIndpbmRvd1wiKTtcbiAgICAgICAgdmlld3BvcnRXaWR0aCA9IHZpZXdwb3J0LndpZHRoO1xuICAgICAgICB2aWV3cG9ydEhlaWdodCA9IHZpZXdwb3J0LmhlaWdodDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmlnaHQgPSByZWN0LnggKyByZWN0LndpZHRoO1xuICAgICAgY29uc3QgYm90dG9tID0gcmVjdC55ICsgcmVjdC5oZWlnaHQ7XG4gICAgICByZXR1cm4gcmlnaHQgPiAwICYmIGJvdHRvbSA+IDAgJiYgcmVjdC54IDwgdmlld3BvcnRXaWR0aCAmJiByZWN0LnkgPCB2aWV3cG9ydEhlaWdodDtcbiAgICB9LCBbXSk7XG5cbiAgICBjb25zdCByZWdpc3RlclJlY3QgPSB1c2VDYWxsYmFjayhcbiAgICAgIChyZWN0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9LCB2aXNpYmxlID0gaXNWaXNpYmxlUmVmLmN1cnJlbnQpID0+IHtcbiAgICAgICAgY29uc3QgaGFzTWVhc3VyZWRTaXplID0gcmVjdC53aWR0aCA+IDAgJiYgcmVjdC5oZWlnaHQgPiAwO1xuICAgICAgICBpZiAoIXZpc2libGUgfHwgKGhhc01lYXN1cmVkU2l6ZSAmJiAhaXNSZWN0SW5WaWV3cG9ydChyZWN0KSkpIHtcbiAgICAgICAgICBkZWxldGUgQWxsR2VuaWVEaXNwbGF5ZWRJbnN0YW5jZXNbaW50ZXJmYWNlSWRdO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIEFsbEdlbmllRGlzcGxheWVkSW5zdGFuY2VzW2ludGVyZmFjZUlkXSA9ICgpID0+ICh7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICAgICAga2V5OiBrZXlSZWYuY3VycmVudCxcbiAgICAgICAgICBpc0ZvY3VzZWRTY3JlZW4sXG4gICAgICAgICAgcmVjdDoge1xuICAgICAgICAgICAgeDogcmVjdC54LFxuICAgICAgICAgICAgeTogcmVjdC55LFxuICAgICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0LFxuICAgICAgICAgICAgdG9wOiByZWN0LnksXG4gICAgICAgICAgICBsZWZ0OiByZWN0LngsXG4gICAgICAgICAgICBib3R0b206IHJlY3QueSArIHJlY3QuaGVpZ2h0LFxuICAgICAgICAgICAgcmlnaHQ6IHJlY3QueCArIHJlY3Qud2lkdGgsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgW2NsYXNzTmFtZSwgaW50ZXJmYWNlSWQsIGlzRm9jdXNlZFNjcmVlbiwgaXNSZWN0SW5WaWV3cG9ydF0sXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZVJlY3RGcm9tQ3VycmVudE5vZGUgPSB1c2VDYWxsYmFjayhcbiAgICAgIChcbiAgICAgICAgZmFsbGJhY2tSZWN0PzogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSxcbiAgICAgICAgcHJlZmVycmVkUmVjdD86IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0sXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKFBsYXRmb3JtLk9TID09PSBcIndlYlwiKSB7XG4gICAgICAgICAgaWYgKHByZWZlcnJlZFJlY3QpIHtcbiAgICAgICAgICAgIGxheW91dFJlZi5jdXJyZW50ID0gcHJlZmVycmVkUmVjdDtcbiAgICAgICAgICAgIHJlZ2lzdGVyUmVjdChwcmVmZXJyZWRSZWN0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB3ZWJOb2RlID0gdmlld1JlZi5jdXJyZW50IGFzIGFueTtcbiAgICAgICAgICBpZiAod2ViTm9kZT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBkb21SZWN0ID0gd2ViTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVkUmVjdCA9IHtcbiAgICAgICAgICAgICAgeDogZG9tUmVjdC5sZWZ0LFxuICAgICAgICAgICAgICB5OiBkb21SZWN0LnRvcCxcbiAgICAgICAgICAgICAgd2lkdGg6IGRvbVJlY3Qud2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodDogZG9tUmVjdC5oZWlnaHQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGF5b3V0UmVmLmN1cnJlbnQgPSBtZWFzdXJlZFJlY3Q7XG4gICAgICAgICAgICByZWdpc3RlclJlY3QobWVhc3VyZWRSZWN0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAod2ViTm9kZT8ubWVhc3VyZSkge1xuICAgICAgICAgICAgd2ViTm9kZS5tZWFzdXJlKFxuICAgICAgICAgICAgICAoX3g6IG51bWJlciwgX3k6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHBhZ2VYOiBudW1iZXIsIHBhZ2VZOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZWFzdXJlZFJlY3QgPSB7XG4gICAgICAgICAgICAgICAgICB4OiBwYWdlWCA/PyBmYWxsYmFja1JlY3Q/LnggPz8gMCxcbiAgICAgICAgICAgICAgICAgIHk6IHBhZ2VZID8/IGZhbGxiYWNrUmVjdD8ueSA/PyAwLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoID8/IGZhbGxiYWNrUmVjdD8ud2lkdGggPz8gMCxcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0ID8/IGZhbGxiYWNrUmVjdD8uaGVpZ2h0ID8/IDAsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsYXlvdXRSZWYuY3VycmVudCA9IG1lYXN1cmVkUmVjdDtcbiAgICAgICAgICAgICAgICByZWdpc3RlclJlY3QobWVhc3VyZWRSZWN0KTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHdlYk5vZGU/Lm1lYXN1cmVJbldpbmRvdykge1xuICAgICAgICAgICAgd2ViTm9kZS5tZWFzdXJlSW5XaW5kb3coKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBtZWFzdXJlZFJlY3QgPSB7XG4gICAgICAgICAgICAgICAgeDogeCA/PyBmYWxsYmFja1JlY3Q/LnggPz8gMCxcbiAgICAgICAgICAgICAgICB5OiB5ID8/IGZhbGxiYWNrUmVjdD8ueSA/PyAwLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCA/PyBmYWxsYmFja1JlY3Q/LndpZHRoID8/IDAsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgPz8gZmFsbGJhY2tSZWN0Py5oZWlnaHQgPz8gMCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgbGF5b3V0UmVmLmN1cnJlbnQgPSBtZWFzdXJlZFJlY3Q7XG4gICAgICAgICAgICAgIHJlZ2lzdGVyUmVjdChtZWFzdXJlZFJlY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZhbGxiYWNrUmVjdCkge1xuICAgICAgICAgICAgbGF5b3V0UmVmLmN1cnJlbnQgPSBmYWxsYmFja1JlY3Q7XG4gICAgICAgICAgICByZWdpc3RlclJlY3QoZmFsbGJhY2tSZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmF0aXZlTm9kZSA9IHZpZXdSZWYuY3VycmVudCBhcyBhbnk7XG4gICAgICAgIGlmIChuYXRpdmVOb2RlPy5tZWFzdXJlKSB7XG4gICAgICAgICAgbmF0aXZlTm9kZS5tZWFzdXJlKFxuICAgICAgICAgICAgKF94OiBudW1iZXIsIF95OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBwYWdlWDogbnVtYmVyLCBwYWdlWTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVkUmVjdCA9IHtcbiAgICAgICAgICAgICAgICB4OiBwYWdlWCA/PyAwLFxuICAgICAgICAgICAgICAgIHk6IHBhZ2VZID8/IDAsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoID8/IGZhbGxiYWNrUmVjdD8ud2lkdGggPz8gMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCA/PyBmYWxsYmFja1JlY3Q/LmhlaWdodCA/PyAwLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBsYXlvdXRSZWYuY3VycmVudCA9IG1lYXN1cmVkUmVjdDtcbiAgICAgICAgICAgICAgcmVnaXN0ZXJSZWN0KG1lYXN1cmVkUmVjdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5hdGl2ZU5vZGU/Lm1lYXN1cmVJbldpbmRvdykge1xuICAgICAgICAgIG5hdGl2ZU5vZGUubWVhc3VyZUluV2luZG93KCh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVkUmVjdCA9IHtcbiAgICAgICAgICAgICAgeDogeCA/PyAwLFxuICAgICAgICAgICAgICB5OiB5ID8/IDAsXG4gICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCA/PyAwLFxuICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCA/PyAwLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxheW91dFJlZi5jdXJyZW50ID0gbWVhc3VyZWRSZWN0O1xuICAgICAgICAgICAgcmVnaXN0ZXJSZWN0KG1lYXN1cmVkUmVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZhbGxiYWNrUmVjdCkge1xuICAgICAgICAgIGxheW91dFJlZi5jdXJyZW50ID0gZmFsbGJhY2tSZWN0O1xuICAgICAgICAgIHJlZ2lzdGVyUmVjdChmYWxsYmFja1JlY3QpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW3JlZ2lzdGVyUmVjdF0sXG4gICAgKTtcblxuICAgIGNvbnN0IHVwZGF0ZVJlY3RGcm9tTmF0aXZlRXZlbnRUYXJnZXQgPSB1c2VDYWxsYmFjayhcbiAgICAgIChcbiAgICAgICAgdGFyZ2V0VGFnOiB1bmtub3duLFxuICAgICAgICBmYWxsYmFja1JlY3Q/OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChQbGF0Zm9ybS5PUyA9PT0gXCJ3ZWJcIiB8fCB0eXBlb2YgdGFyZ2V0VGFnICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmF0aXZlVWlNYW5hZ2VyID0gVUlNYW5hZ2VyIGFzIGFueTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYXRpdmVVaU1hbmFnZXI/Lm1lYXN1cmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG5hdGl2ZVVpTWFuYWdlci5tZWFzdXJlKFxuICAgICAgICAgICAgdGFyZ2V0VGFnLFxuICAgICAgICAgICAgKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgcGFnZVg6IG51bWJlciwgcGFnZVk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBtZWFzdXJlZFJlY3QgPSB7XG4gICAgICAgICAgICAgICAgeDogcGFnZVggPz8geCA/PyBmYWxsYmFja1JlY3Q/LnggPz8gMCxcbiAgICAgICAgICAgICAgICB5OiBwYWdlWSA/PyB5ID8/IGZhbGxiYWNrUmVjdD8ueSA/PyAwLFxuICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCA/PyBmYWxsYmFja1JlY3Q/LndpZHRoID8/IDAsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgPz8gZmFsbGJhY2tSZWN0Py5oZWlnaHQgPz8gMCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgbGF5b3V0UmVmLmN1cnJlbnQgPSBtZWFzdXJlZFJlY3Q7XG4gICAgICAgICAgICAgIHJlZ2lzdGVyUmVjdChtZWFzdXJlZFJlY3QpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgbmF0aXZlVWlNYW5hZ2VyPy5tZWFzdXJlSW5XaW5kb3cgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIG5hdGl2ZVVpTWFuYWdlci5tZWFzdXJlSW5XaW5kb3coXG4gICAgICAgICAgICB0YXJnZXRUYWcsXG4gICAgICAgICAgICAoeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVkUmVjdCA9IHtcbiAgICAgICAgICAgICAgICB4OiB4ID8/IGZhbGxiYWNrUmVjdD8ueCA/PyAwLFxuICAgICAgICAgICAgICAgIHk6IHkgPz8gZmFsbGJhY2tSZWN0Py55ID8/IDAsXG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoID8/IGZhbGxiYWNrUmVjdD8ud2lkdGggPz8gMCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCA/PyBmYWxsYmFja1JlY3Q/LmhlaWdodCA/PyAwLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBsYXlvdXRSZWYuY3VycmVudCA9IG1lYXN1cmVkUmVjdDtcbiAgICAgICAgICAgICAgcmVnaXN0ZXJSZWN0KG1lYXN1cmVkUmVjdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbcmVnaXN0ZXJSZWN0XSxcbiAgICApO1xuXG4gICAgY29uc3QgZ2V0V2ViRXZlbnRSZWN0ID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBMYXlvdXRDaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgY29uc3Qgd2ViVGFyZ2V0ID1cbiAgICAgICAgKGV2ZW50IGFzIGFueSkuY3VycmVudFRhcmdldCA/P1xuICAgICAgICAoZXZlbnQgYXMgYW55KS50YXJnZXQgPz9cbiAgICAgICAgKGV2ZW50Lm5hdGl2ZUV2ZW50IGFzIGFueSk/LnRhcmdldDtcblxuICAgICAgaWYgKHdlYlRhcmdldD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICAgIGNvbnN0IGRvbVJlY3QgPSB3ZWJUYXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogZG9tUmVjdC5sZWZ0LFxuICAgICAgICAgIHk6IGRvbVJlY3QudG9wLFxuICAgICAgICAgIHdpZHRoOiBkb21SZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogZG9tUmVjdC5oZWlnaHQsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSwgW10pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGtleVJlZi5jdXJyZW50ID0gY2hpbGRQYXJhbXNbMF07XG4gICAgICBpZiAoaXNWaXNpYmxlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmVnaXN0ZXJSZWN0KGxheW91dFJlZi5jdXJyZW50KTtcbiAgICAgIH1cbiAgICB9LCBbY2hpbGRQYXJhbXMsIHJlZ2lzdGVyUmVjdF0pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBHZW5pZVZpZXdXcmFwcGVyOiAke2NsYXNzTmFtZX0gJHtpbnRlcmZhY2VJZH0gY3JlYXRlZGApO1xuICAgICAgXG4gICAgICAvLyBNYXJrIGFzIHZpc2libGUgb24gbW91bnQgKGZvciBuYXRpdmUgcGxhdGZvcm1zIHdoZXJlIGFsbCByZW5kZXJlZCBjb21wb25lbnRzIGFyZSBjb25zaWRlcmVkIFwidmlzaWJsZVwiKVxuICAgICAgcmVnaXN0ZXJSZWN0KGxheW91dFJlZi5jdXJyZW50KTtcbiAgICAgIFxuICAgICAgLy8gRm9yIHdlYiBwbGF0Zm9ybSwgdXNlIEludGVyc2VjdGlvbk9ic2VydmVyIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKFBsYXRmb3JtLk9TID09PSAnd2ViJyAmJiB0eXBlb2YgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKFxuICAgICAgICAgIChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbZW50cnldID0gZW50cmllcztcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGUgPSBlbnRyeS5pc0ludGVyc2VjdGluZztcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBgR2VuaWVWaWV3V3JhcHBlcjogJHtjbGFzc05hbWV9ICR7aW50ZXJmYWNlSWR9ICR7dmlzaWJsZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc2V0SXNWaXNpYmxlKHZpc2libGUpO1xuICAgICAgICAgICAgaWYgKCF2aXNpYmxlKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBBbGxHZW5pZURpc3BsYXllZEluc3RhbmNlc1tpbnRlcmZhY2VJZF07XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVudHJ5UmVjdCA9IGVudHJ5LmJvdW5kaW5nQ2xpZW50UmVjdFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIHg6IGVudHJ5LmJvdW5kaW5nQ2xpZW50UmVjdC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgeTogZW50cnkuYm91bmRpbmdDbGllbnRSZWN0LnRvcCxcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiBlbnRyeS5ib3VuZGluZ0NsaWVudFJlY3Qud2lkdGgsXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IGVudHJ5LmJvdW5kaW5nQ2xpZW50UmVjdC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHVwZGF0ZVJlY3RGcm9tQ3VycmVudE5vZGUobGF5b3V0UmVmLmN1cnJlbnQsIGVudHJ5UmVjdCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHRocmVzaG9sZDogMC4xIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBGb3Igd2ViLCB2aWV3UmVmLmN1cnJlbnQgaXMgdGhlIERPTSBub2RlXG4gICAgICAgIGlmICh2aWV3UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHZpZXdSZWYuY3VycmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgR2VuaWVWaWV3V3JhcHBlcjogJHtjbGFzc05hbWV9ICR7aW50ZXJmYWNlSWR9IGRlc3Ryb3llZGApO1xuICAgICAgICAgIGRlbGV0ZSBBbGxHZW5pZURpc3BsYXllZEluc3RhbmNlc1tpbnRlcmZhY2VJZF07XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFudXAgZm9yIG5hdGl2ZSBwbGF0Zm9ybXNcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBHZW5pZVZpZXdXcmFwcGVyOiAke2NsYXNzTmFtZX0gJHtpbnRlcmZhY2VJZH0gZGVzdHJveWVkYCk7XG4gICAgICAgIGRlbGV0ZSBBbGxHZW5pZURpc3BsYXllZEluc3RhbmNlc1tpbnRlcmZhY2VJZF07XG4gICAgICB9O1xuICAgIH0sIFtjbGFzc05hbWUsIGludGVyZmFjZUlkLCByZWdpc3RlclJlY3QsIHVwZGF0ZVJlY3RGcm9tQ3VycmVudE5vZGVdKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyBFeHBvc2UgYSBsaXZlIHJlLW1lYXN1cmUgaG9vayBzbyB0YXAgY2FwdHVyZSBjYW4gcmVmcmVzaCBjYWNoZWQgYm91bmRzXG4gICAgICAvLyB3aXRob3V0IGZvcmNpbmcgdGhlIHdyYXBwZXIgdG8gcmVtb3VudC5cbiAgICAgIEFsbEdlbmllRGlzcGxheWVkSW5zdGFuY2VSZWZyZXNoZXJzW2ludGVyZmFjZUlkXSA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFpc1Zpc2libGVSZWYuY3VycmVudCkge1xuICAgICAgICAgIGRlbGV0ZSBBbGxHZW5pZURpc3BsYXllZEluc3RhbmNlc1tpbnRlcmZhY2VJZF07XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZVJlY3RGcm9tQ3VycmVudE5vZGUobGF5b3V0UmVmLmN1cnJlbnQpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZGVsZXRlIEFsbEdlbmllRGlzcGxheWVkSW5zdGFuY2VSZWZyZXNoZXJzW2ludGVyZmFjZUlkXTtcbiAgICAgIH07XG4gICAgfSwgW2ludGVyZmFjZUlkLCB1cGRhdGVSZWN0RnJvbUN1cnJlbnROb2RlXSk7XG5cbiAgICBjb25zdCBoYW5kbGVMYXlvdXQgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IExheW91dENoYW5nZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IGV2ZW50Lm5hdGl2ZUV2ZW50LmxheW91dDtcbiAgICAgIGNvbnN0IG5ld0xheW91dCA9IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9O1xuICAgICAgc2V0TGF5b3V0KG5ld0xheW91dCk7XG4gICAgICBsYXlvdXRSZWYuY3VycmVudCA9IG5ld0xheW91dDsgLy8gVXBkYXRlIHJlZiBpbW1lZGlhdGVseVxuXG4gICAgICBpZiAoUGxhdGZvcm0uT1MgPT09IFwid2ViXCIpIHtcbiAgICAgICAgY29uc3Qgd2ViUmVjdCA9IGdldFdlYkV2ZW50UmVjdChldmVudCk7XG4gICAgICAgIHVwZGF0ZVJlY3RGcm9tQ3VycmVudE5vZGUobmV3TGF5b3V0LCB3ZWJSZWN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVSZWN0RnJvbUN1cnJlbnROb2RlKG5ld0xheW91dCk7XG4gICAgICB1cGRhdGVSZWN0RnJvbU5hdGl2ZUV2ZW50VGFyZ2V0KChldmVudC5uYXRpdmVFdmVudCBhcyBhbnkpPy50YXJnZXQsIG5ld0xheW91dCk7XG4gICAgfSwgW2dldFdlYkV2ZW50UmVjdCwgdXBkYXRlUmVjdEZyb21DdXJyZW50Tm9kZSwgdXBkYXRlUmVjdEZyb21OYXRpdmVFdmVudFRhcmdldF0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgLSByZWYgd29ya3MgZGlmZmVyZW50bHkgb24gd2ViIHZzIG5hdGl2ZVxuICAgICAgICByZWY9e3ZpZXdSZWZ9XG4gICAgICAgIHN0eWxlPXtcbiAgICAgICAgICBQbGF0Zm9ybS5PUyA9PT0gXCJ3ZWJcIlxuICAgICAgICAgICAgPyBpc1NjcmVlblZpZXdXcmFwcGVyXG4gICAgICAgICAgICAgID8gc3R5bGVzLndlYlNjcmVlbkNvbnRhaW5lclxuICAgICAgICAgICAgICA6IHN0eWxlcy53ZWJJbmxpbmVDb250YWluZXJcbiAgICAgICAgICAgIDogaXNTY3JlZW5WaWV3V3JhcHBlclxuICAgICAgICAgICAgICA/IHN0eWxlcy5uYXRpdmVTY3JlZW5Db250YWluZXJcbiAgICAgICAgICAgICAgOiBzdHlsZXMubmF0aXZlSW5saW5lQ29udGFpbmVyXG4gICAgICAgIH1cbiAgICAgICAgb25MYXlvdXQ9e2hhbmRsZUxheW91dH1cbiAgICAgICAgY29sbGFwc2FibGU9e2ZhbHNlfVxuICAgICAgICB0ZXN0SUQ9XCJnZW5pZS13cmFwcGVyXCJcbiAgICAgID5cbiAgICAgICAge2NoaWxkQ29tcG9uZW50KC4uLmNoaWxkUGFyYW1zKX1cbiAgICAgIDwvVmlldz5cbiAgICApO1xuICB9O1xuXG5jb25zdCBzdHlsZXMgPSBTdHlsZVNoZWV0LmNyZWF0ZSh7XG4gIHdlYlNjcmVlbkNvbnRhaW5lcjoge1xuICAgIC8vIFNjcmVlbi1sZXZlbCB3cmFwcGVycyBvbiB3ZWIgbmVlZCBncm93dGggc28gc2hvcnQgc2NyZWVucyBzdGlsbCBmaWxsIHRoZVxuICAgIC8vIHZpZXdwb3J0IGluc3RlYWQgb2YgY29sbGFwc2luZyB0byBjb250ZW50IGhlaWdodC5cbiAgICBmbGV4R3JvdzogMSxcbiAgICBmbGV4U2hyaW5rOiAxLFxuICAgIG1pbkhlaWdodDogMCxcbiAgICBtaW5XaWR0aDogMCxcbiAgfSxcbiAgd2ViSW5saW5lQ29udGFpbmVyOiB7XG4gICAgLy8gSW5saW5lIHdyYXBwZXJzIHNob3VsZCByZW1haW4gbWVhc3VyYWJsZSB3aXRob3V0IGZvcmNpbmcgbGF5b3V0IGdyb3d0aC5cbiAgICBmbGV4U2hyaW5rOiAxLFxuICAgIG1pbkhlaWdodDogMCxcbiAgICBtaW5XaWR0aDogMCxcbiAgfSxcbiAgbmF0aXZlU2NyZWVuQ29udGFpbmVyOiB7XG4gICAgLy8gU2NyZWVuLWxldmVsIHdyYXBwZXJzIG5lZWQgZ3Jvd3RoIHRvIGF2b2lkIGNvbGxhcHNpbmcgZmxleDoxIGNoaWxkcmVuLlxuICAgIGZsZXhHcm93OiAxLFxuICAgIGZsZXhTaHJpbms6IDEsXG4gICAgbWluSGVpZ2h0OiAwLFxuICAgIG1pbldpZHRoOiAwLFxuICB9LFxuICBuYXRpdmVJbmxpbmVDb250YWluZXI6IHtcbiAgICAvLyBLZWVwIGlubGluZSB3cmFwcGVycyBtZWFzdXJhYmxlIHdpdGhvdXQgZm9yY2luZyBzY3JlZW4tbGV2ZWwgZ3Jvd3RoLlxuICAgIG1pbkhlaWdodDogMCxcbiAgICBtaW5XaWR0aDogMCxcbiAgfSxcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxZQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxnQkFBQSxHQUFBRixPQUFBO0FBRzRCLFNBQUFELHdCQUFBSSxDQUFBLEVBQUFDLENBQUEsNkJBQUFDLE9BQUEsTUFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBTix1QkFBQSxZQUFBQSxDQUFBSSxDQUFBLEVBQUFDLENBQUEsU0FBQUEsQ0FBQSxJQUFBRCxDQUFBLElBQUFBLENBQUEsQ0FBQUssVUFBQSxTQUFBTCxDQUFBLE1BQUFNLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLEtBQUFDLFNBQUEsUUFBQUMsT0FBQSxFQUFBVixDQUFBLGlCQUFBQSxDQUFBLHVCQUFBQSxDQUFBLHlCQUFBQSxDQUFBLFNBQUFRLENBQUEsTUFBQUYsQ0FBQSxHQUFBTCxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxRQUFBRyxDQUFBLENBQUFLLEdBQUEsQ0FBQVgsQ0FBQSxVQUFBTSxDQUFBLENBQUFNLEdBQUEsQ0FBQVosQ0FB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|