@opcua/for-node-red
Version:
The Node-RED node to communicate via OPC UA, powered NodeOPCUA and developed by Sterfive's team
420 lines (339 loc) • 89.3 kB
HTML
<style>
.sterfive-combo-box{position:relative;width:100%}.sterfive-online-menu{height:auto;position:fixed;width:auto}.sterfive-input-error{border-color:var(--red-ui-form-input-border-error-color);border-style:solid;border-width:1px}.sterfive-typedInput-options{background:#fff;border-style:solid;border-width:1px;border:1px solid var(--red-ui-primary-border-color);box-sizing:border-box;max-height:350px;overflow-y:auto;position:absolute;white-space:nowrap;z-index:2000}.sterfive-typedInput-options a{align-items:center;border-bottom:1px solid;border-color:var(--red-ui-secondary-border-color);border-style:solid;border-width:1px;color:var(--red-ui-form-text-color);display:flex;font-size:13px;padding:6px 18px 6px 6px;text-decoration:none}.sterfive-typedInput-options a:hover{background:var(--red-ui-workspace-button-background-hover);text-decoration:none}.sterfive-typedInput-options a:focus{outline:none}.sterfive-typedInput-options a:active,.sterfive-typedInput-options a:focus{background:var(--red-ui-workspace-button-background-active);text-decoration:none}.sterfive-typedInput-options a input[type=checkbox]{margin:0 6px 0 0}.sterfive-typedInput-options .sterfive-typedInput-icon{margin-right:6px}.sterfive-typedInput-options .sterfive-typedInput-icon:not(.fa){background-color:var(--red-ui-primary-text-color);height:14px;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:cover;mask-size:cover;width:12px}.sterfive-combo-box .sterfive-dropdown{background-color:#fff;border:1px solid #ccc;display:none;left:0;max-height:400px;overflow-y:auto;position:absolute;top:100%;width:100%;z-index:1000}.sterfive-combo-box li:before{content:none}.sterfive-tree li.expandable:before,.sterfive-tree li.no-expandable:before{content:"\f0da";cursor:pointer;font-family:FontAwesome,sans-serif;font-size:12pt;font-weight:900;margin-right:5px}.sterfive-tree li.no-expandable:before{opacity:0}.sterfive-tree li.expanded:before{content:"\f0d7";cursor:pointer;font-family:FontAwesome,sans-serif;font-size:12pt;font-weight:900;margin-right:5px}.sterfive-tree li span.selected{border:.5px dotted #33f}.sterfive-tree .fa{color:#333;margin-right:10px}.sterfive-tree ul{list-style:none;padding-inline-start:2%}.sterfive-tree li{cursor:pointer;padding:5px}.sterfive-tree{list-style-type:none}.sterfive-tree,.sterfive-tree ol,.sterfive-tree ul{list-style-type:none;margin:0;padding:0}.sterfive-tree li:hover{background-color:#eee}.sterfive-tree li.loading:before{animation:fa-spin 1s linear infinite;content:"\f110";cursor:pointer;font-family:FontAwesome,sans-serif;font-weight:900;margin-right:5px}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.sterfive-tree .spinner{animation:spin .7s linear infinite;border:2px solid transparent;border-radius:50%;border-top-color:#666;display:inline-block;height:16px;width:16px}.sterfive-info{background-color:#fafad2;border-radius:10px;border-style:groove;display:block;font-size:10pt;margin:5px 0;padding:5px}.sterfive-info .ok{color:green}.sterfive-info .warning{color:darkred}.input-wrapper{border:0 solid #ccc;border-radius:5px;padding:0}.sterfive-input-group{border:1px solid #ccc;border-radius:5px;display:flex;overflow:hidden}.sterfive-input-group button,.sterfive-input-group input{border:none;outline:none;padding:10px}.sterfive-input-group input{flex:1}.sterfive-input-group button{background-color:var(--red-ui-form-button-background);color:#7b7a7a;cursor:pointer}.sterfive-input-group button:hover{background-color:var(--red-ui-secondary-background-hover)}.sterfive-info-text{color:#777;font-size:12px;margin-left:10px;margin-top:5px}.custom-checkbox{cursor:pointer;display:inline-block;font-family:FontAwesome,sans-serif;font-size:16px;font-weight:900;margin-right:10px;text-align:center;width:1em}.custom-checkbox.unchecked:before{content:"\f096"}.custom-checkbox.checked:before{content:"\f046"}.validate-cancel-buttons{background-color:#fff;position:sticky;right:0;top:0;z-index:1001}.cancel-button,.validate-button{cursor:pointer;font-size:16px;margin:5px}.sterfive-combo-box .sterfive-dropdown{position:relative}.floating-buttons{position:fixed;z-index:1003}
/*# sourceMappingURL=OpcUa-Client2-Monitor.css.map */
</style>
<!-- HTML CONTENTS -->
<script type="text/x-red" data-template-name="OpcUa-Client2-Monitor">
<style>
.my-checkbox-label {
width: fit-content;
cursor: pointer;
user-select: none;
}
.my-checkbox-input {
visibility: hidden;
}
.my-checkbox-mark {
margin-left: 0px;
font-family: "FontAwesome", sans-serif;
font-size: 24px;
}
.my-checkbox-input:checked ~ .my-checkbox-mark::before {
content: "\f205";
/* fa-toggle-on */
}
.my-checkbox-input:not(:checked) ~ .my-checkbox-mark::before {
content: "\f204";
/* fa-toggle-off */
}
</style>
<!-- name -->
<div class="form-row">
<label for="node-input-name"><i class="icon-tasks"></i>Name</label>
<input type="text" id="node-input-name" placeholder="enter the friendly name of the node" />
</div>
<!-- endpoint -->
<div class="form-row">
<label for="node-input-endpoint"><i class="icon-tasks"></i> Endpoint</label>
<input type="text" id="node-input-endpoint" placeholder="opc.tcp://localhost:4334" />
</div>
<!-- Subscription selector -->
<div class="form-row">
<label for="node-input-subscription"><i class="fa fa-rss"></i> subscription</label>
<select type="text" id="node-input-subscription" style="width: 250px"></select>
</div>
<!-- Start Immediately -->
<div class="form-row" style="display: flex; align-items: center; width: 250px">
<i class="fa fa-play"></i>
<span>start immediately</span>
<label for="node-input-startImmediately" style="margin-left: auto; display: flex; align-items: center">
<input type="checkbox" checked class="my-checkbox-input" id="node-input-startImmediately" />
<span class="my-checkbox-mark"></span>
</label>
</div>
<!-- node to monitor -->
<div class="form-row">
<label for="node-input-nodeId" style="width: 100%"><i class="fa fa-id-card"></i><span> NodeId</span></label>
<input type="text" id="node-input-nodeId" placeholder="ns=2;s=Variable1 or empty" />
</div>
<!-- samplingInterval — stored canonically in ms; entered via a display field + unit.
Wired by installDurationField() (see source/ui/duration-field.ts). -->
<div class="form-row">
<label for="node-input-samplingInterval-display" style="width: 150px">
<i class="fa fa-hourglass"></i>
<span>Sampling Interval</span>
</label>
<input type="hidden" id="node-input-samplingInterval" />
<input
type="number"
step="1"
min="-1"
id="node-input-samplingInterval-display"
placeholder="number"
style="max-width: 80px"
/>
<select id="node-input-samplingInterval_timeUnit" style="max-width: 120px">
<option value="ms">millisecond(s)</option>
<option value="s">second(s)</option>
<option value="m">minute(s)</option>
<option value="h">hour(s)</option>
</select>
</div>
<!-- queueSize -->
<div class="form-row">
<label for="node-input-queueSize" style="width: 150px">
<i class="fa fa-tag"></i>
<span>queue size</span>
</label>
<input
type="number"
style="width: 90px"
step="1"
min="0"
max="65535"
id="node-input-queueSize"
placeholder="queue size"
/>
</div>
<!-- queueSize AutoButton -->
<!-- discard oldest -->
<div class="form-row" style="display: flex; align-items: center; width: 250px">
<i class="fa fa-play"></i>
<span>discard oldest</span>
<label for="node-input-discardOldest" style="margin-left: auto; display: flex; align-items: center">
<input type="checkbox" checked class="my-checkbox-input" id="node-input-discardOldest" />
<span class="my-checkbox-mark"></span>
</label>
</div>
<!-- deadBandType -->
<div class="form-row">
<label for="node-input-deadbandlabel" style="width: 150px">
<i class="fa fa-check-square"></i>
<span>Deadband type</span>
</label>
<input
type="number"
id="node-input-deadbandValue"
step="0.01"
min="0"
max="100000"
placeholder="number"
style="max-width: 80px"
/>
<select id="node-input-deadbandType" style="max-width: 120px">
<option value="">Not use</option>
<option value="a">Absolute</option>
<option value="p">Percent</option>
</select>
</div>
<div class="form-row">
<!-- DataChangeTrigger enum
1 is is the default setting if no filter is set.
!-->
<label for="node-input-trigger">trigger</label>
<select type="text" id="node-input-trigger" style="width: 250px">
<option value="0">Status</option>
<option selected value="1">StatusValue</option>
<option value="2">StatusValueTimestamp</option>
</select>
</div>
<div class="form-row">
<label for="node-input-outputType">Output type</label>
<select type="text" id="node-input-outputType" style="width: 250px">
<option selected value="Value">Value</option>
<option value="DataValue">DataValue</option>
<option value="Variant">Variant</option>
<option value="DataValueReversible">DataValueReversible</option>
<option value="StatusCode">StatusCode</option>
</select>
</div>
<!-- resilience options -->
<hr />
<!-- retry unknown nodes -->
<div class="form-row" style="display: flex; align-items: center; width: 250px">
<i class="fa fa-refresh"></i>
<span>retry unknown nodes</span>
<label for="node-input-retryUnknownNodes" style="margin-left: auto; display: flex; align-items: center">
<input type="checkbox" checked class="my-checkbox-input" id="node-input-retryUnknownNodes" />
<span class="my-checkbox-mark"></span>
</label>
</div>
<!-- retry interval (stored canonically in ms; entered via display + unit) -->
<div class="form-row">
<label for="node-input-retryUnknownInterval-display" style="width: 150px">
<i class="fa fa-hourglass"></i>
<span>Retry interval</span>
</label>
<input type="hidden" id="node-input-retryUnknownInterval" />
<input
type="number"
step="1"
min="1"
id="node-input-retryUnknownInterval-display"
placeholder="number"
style="max-width: 80px"
/>
<select id="node-input-retryUnknownInterval_timeUnit" style="max-width: 120px">
<option value="ms">millisecond(s)</option>
<option value="s">second(s)</option>
<option value="m">minute(s)</option>
<option value="h">hour(s)</option>
</select>
</div>
<!-- mark bad on disconnect -->
<div class="form-row" style="display: flex; align-items: center; width: 250px">
<i class="fa fa-unlink"></i>
<span>mark values bad on disconnect</span>
<label for="node-input-markBadOnDisconnect" style="margin-left: auto; display: flex; align-items: center">
<input type="checkbox" class="my-checkbox-input" id="node-input-markBadOnDisconnect" />
<span class="my-checkbox-mark"></span>
</label>
</div>
</script>
<!-- MARKDOWN CONTENTS -->
<script type="text/markdown" data-help-name="OpcUa-Client2-Monitor">
## Monitor OPC UA Variables
The monitored items are the nodes that are monitored by the client.
The client will send a notification when the value of the node changes.
You can either specify a nodeId to monitor directly on this node, or inject or more node-id.
The output message will contain the current value of the monitored nodes.
This node is configured once and then can be forgotten, it will send messages whenever the conditions are met.
### Properties
- **Name**: The name of the node
- **Endpoint**: The predefined endpoint of the OPC UA server to connect to.
- **Subscription** : The subscription to use for monitoring the nodes, Subscriptions are defined in the "Endpoint" node.
The frequence at which the server will send a batch of notification is handled by the subscription is specified in this subscription.
A subscription can typically hold a large number of monitored items.
This node manages a single or a subset of the monitored items handled by the selected subscription.
- **Start Immediately**: indicates if the subscription should be launch immediately when the flow starts:
If checked, the subscription will start immediately, by automatically monitoring the nodes specified in NodeId field.
If unchecked, the subscription will start when the first message arrives, with the nodeId property in the payload (see belows) or with the nodeId property specified in the node configuration.
If you want to monitor an array of UAVariable or a JSON structure, you need to unset the `start immediatly' node, clear the NodeId field and inject the NodeId you want to monitor using one of the technics decribed below.
- **Sample Interval**: The interval in milliseconds to use for monitoring the nodes.
This is the interval at which the client will request the server to sample variable changes. (default: 1000 ms)
Sampling is done by the OPC UA Server itself on behalf the cliient.
The OPC UA server will only submit data change notificiation if the UAVariable dataValue has actually changed, as [per OPC UA specificiations](https://reference.opcfoundation.org/Core/Part4/v105/docs/5.13.1).
- **Queue Size**: The maximum number of notifications that the client will store in the queue. If the queue is full, the oldest notification will be removed. (default: 1000) [see OPC UA Specification](https://reference.opcfoundation.org/Core/Part4/v105/docs/5.13.1.5)
- **Discard Oldest**: If the queue is full, the oldest notification will be removed. If unchecked, the newest notification will be removed. (default: true)
- **Deadband**: The deadband value to use for monitoring the nodes.
- **Not Use** : No dead band filter
- **Absolute** : The deadband is an absolute value. The server will send a notification if the value changes by more than the deadband value.
- **Percent** : The deadband is a percentage value. The server will send a notification if the value changes by more than the deadband percentage value.
The monitored Value must have a EURange property so that the actual deadband value can be calculated.
- **Trigger**: what kind of change triggers a notification (the data-change filter trigger):
- **Status**: notify only when the status code changes.
- **StatusValue** (default): notify when the status code *or* the value changes.
- **StatusValueTimestamp**: notify when the status, the value, *or* the source timestamp changes.
- **Output type**: how each value is shaped in the output message:
- **Value** (default): `msg.payload` carries the raw value.
- **DataValue**: `msg.payload` carries the full OPC UA `DataValue` (value, statusCode, source/server timestamps).
#### Resilience options
These options make a monitor *self-healing*: it keeps converging towards the set of variables you asked for, across late-arriving nodes, reboots and outages, with no redeploy.
- **Retry unknown nodes** (default **on**): if a node to monitor does not exist yet, keep it in a *waiting* state and retry until it appears, instead of creating a dead monitored item. See [handling nodes that do not exist yet](#handling-nodes-that-do-not-exist-yet).
- **Retry interval** (default **5 s**): how often to re-check the missing nodes. Entered in ms / s / m / h; stored canonically in milliseconds.
- **Mark values bad on disconnect** (default **off**): when the connection drops, re-emit each monitored item's last value tagged `BadServerNotConnected`, so downstream flows can tell the data is stale.
### monitoring a single OPC UA node specified in the node configuration
simply specify the nodeId of the node you want to monitor in the nodeId field.
### monitoring a single OPC UA node injected in the node
If you want to inject the nodeId, you have to unset the "start immediately" checkbox. The subscription will start when the first message arrives, with the nodeId property in the payload.
### monitoring an arbitrary structure of OPC UA nodes
you can also inject an object with a structure of nodeIds. The output message will contain the same structure with the current values.
for instances:
```json
{
"nodeId1": "ns=1;s=MyVariable1",
"nodeId2": "ns=1;s=MyVariable2",
"sub": {
"nodeId3": "ns=1;s=MyVariable3"
}
}
```
will be automatically monitoring 3 nodes and produce the following ouput when either node value changes:
```json
{
"nodeId1": 123,
"nodeId2": 456,
"sub": {
"nodeId3": 789
}
}
```
```json
{
"nodeId1": {
"value": 123,
"statusCode": "Good",
"sourceTimestamp": "2020-01-01T00:00:00.000Z"
},
"nodeId2": {
"value": 456,
"statusCode": "Good",
"sourceTimestamp": "2020-01-01T00:00:00.000Z"
},
"sub": {
"nodeId3": {
"value": 789,
"statusCode": "Good",
"sourceTimestamp": "2020-01-01T00:00:00.000Z"
}
}
}
```
Note: A JSON structure with nodeId or browse path that represent a complex OPC UA UA can easily be created with the Explore. (see OpcUa-Explore node and monitoring a OPC UA subtree below)
Interval is setting for Client `requestedPublishingInterval` (default: 1000 ms).
Input `msg.payload.samplingInterval` can bring a specific sampling Interval for monitored Items/Events in the subscription.
### monitoring a OPC UA subtree
If you want to monitor a subtree of a OPC UA server, you can conveniently redirect the output of a "OpcUa Explore Node" (with outputType=NodeID) node to the input of this node.
As a result, all nodes of the explored subtree will be monitored. and the payload of the output message of this node will contain the exact structure of the subtree with the current values.
A new message is sent when the value of one of the nodes changes.
### monitoring an array of nodes
If `msg.payload` is an **array** of nodeIds (or browse paths, or `{ nodeId, indexRange }`
objects), every element is monitored as a group and a **single** message is emitted whenever
any of them changes, with:
- `msg.payload`: an array of the monitored values, in the same order as the input array;
- `msg.statusCodes`: a parallel array of status codes (e.g. `"Good"`, `"BadNodeIdUnknown"`);
- `msg.nodeIds`: a parallel array of the resolved nodeIds.
```json
["ns=1;s=Temperature", "ns=1;s=Pressure"]
```
### handling nodes that do not exist yet
If a node to monitor does not exist on the server at creation time, the node does **not**
create a dead monitored item. Instead it reports the node as `BadNodeIdUnknown` (a
placeholder in array/structure output, an informational message for a single node) and
keeps the node in a *waiting* state.
When **retry unknown nodes** is enabled (default), the node periodically re-checks the
missing nodes and starts monitoring them (batched into one group per retry) as soon as they
appear — without disturbing the items that are already being monitored. This works for single,
array and structure monitoring, and scales to thousands of variables.
While the connection is down the retry is paused. Once the connection is restored and the
subscription repaired, the node **reassesses every variable from scratch** — re-monitoring the
ones that exist and re-queueing the ones that don't (e.g. variables that disappeared during the
outage) — then resumes the per-item repair until everything is healthy again.
### marking values bad on disconnect
When **mark values bad on disconnect** is enabled (default off), losing the connection
re-emits each monitored item's last known value tagged with status `BadServerNotConnected`,
so downstream flows can tell the value is now stale (similar to the Read node). Normal values
resume automatically once the connection is restored.
## Tips & Notes
- A OPC UA Monitiored Item only notify change if a change has occured.
- You will always received a initial change notificiation when the monitored item is originally created.
### msg properties
- `msg.outputType`: `undefined | "Value" | "DataValue"`
- `msg.samplingInterval`: sampling interval in miliseconds or 0 to use minimumSampling interval of the corresponding monitored variable.
When specified, it will override the node configuration for the sampling interval.
- `msg.deadbandType`: `undefined | "None" | "Absolute" | "Percent"`
When specified, it will override the node configuration for the deadband type.
- `msg.deadbandValue`: deadband value to use for monitoring the nodes.
- `msg.queueSize`: `<positive number>`The maximum number of notifications that the client will store in the queue. If the queue is full, the oldest notification will be removed. (default: 1000) [see OPC UA Specification](https://reference.opcfoundation.org/Core/Part4/v105/docs/ (default: 1)
- `msg.discardOldest`: `true|false` If the queue is full, the oldest notification will be removed. If unchecked, the newest notification will be removed. (default: false)
### node configuration
- **Retry unknown nodes** (`retryUnknownNodes`, default on): keep retrying nodes that are
not present yet and start monitoring them as soon as they appear.
- **Retry interval** (`retryUnknownInterval`, default 5 s): how often to re-check unknown
nodes (entered in ms/s/m/h; stored in milliseconds).
- **Mark values bad on disconnect** (`markBadOnDisconnect`, default off): on connection loss,
re-emit each monitored value with status `BadServerNotConnected`.
</script>
<!-- END OF CONTENTS -->
<script type="text/javascript">
function _0x295a(_0x497ab3,_0x546ba4){_0x497ab3=_0x497ab3-0x10b;const _0x9789ae=_0x9789();let _0x295abc=_0x9789ae[_0x497ab3];return _0x295abc;}(function(_0x309468,_0x52ea59){const _0xda7164=_0x295a,_0x845d58=_0x309468();while(!![]){try{const _0x15a352=-parseInt(_0xda7164(0x232))/0x1*(-parseInt(_0xda7164(0x116))/0x2)+-parseInt(_0xda7164(0x122))/0x3*(parseInt(_0xda7164(0x13e))/0x4)+-parseInt(_0xda7164(0x27a))/0x5+-parseInt(_0xda7164(0x2cb))/0x6+-parseInt(_0xda7164(0x10c))/0x7*(parseInt(_0xda7164(0x157))/0x8)+parseInt(_0xda7164(0x1f5))/0x9*(parseInt(_0xda7164(0x217))/0xa)+parseInt(_0xda7164(0x112))/0xb;if(_0x15a352===_0x52ea59)break;else _0x845d58['push'](_0x845d58['shift']());}catch(_0x103898){_0x845d58['push'](_0x845d58['shift']());}}}(_0x9789,0x7db70),(function(){'use strict';const _0x3f3267=_0x295a;function _0x15dba9(_0x11d643,_0x15ea14){const _0x2eda93=_0x295a,_0x26eddc=$(_0x2eda93(0x255)),_0x51c286=$(_0x2eda93(0x2ca)),_0x29e84a=()=>{const _0x52b522=_0x2eda93,_0x4bb6be=_0x11d643['nodes']['node'](_0x26eddc['val']());_0x51c286[_0x52b522(0x170)]();if(!(_0x4bb6be===null||_0x4bb6be===void 0x0?void 0x0:_0x4bb6be[_0x52b522(0x12b)]))return;for(const _0x3f7b4f of _0x4bb6be[_0x52b522(0x12b)]){const _0x23ff33=_0x3f7b4f[_0x52b522(0x162)]||_0x3f7b4f['id'];$(_0x52b522(0x1f1),{'value':_0x3f7b4f['id'],'label':_0x23ff33,'selected':_0x3f7b4f['id']===_0x15ea14[_0x52b522(0x15a)]})[_0x52b522(0x2ed)](_0x23ff33)[_0x52b522(0x1b7)](_0x51c286);}};_0x29e84a(),_0x51c286['on']('change',()=>{const _0x526f28=_0x2eda93;_0x15ea14[_0x526f28(0x15a)]=_0x51c286[_0x526f28(0x1cd)]();}),_0x26eddc['on'](_0x2eda93(0x2d6),()=>{_0x29e84a();});}const _0x372d5e={'ms':0x1,'s':0x3e8,'m':0x3c*0x3e8,'h':0x3c*0x3c*0x3e8},_0x18c49b={'ms':_0x3f3267(0x298),'s':_0x3f3267(0x2e2),'m':_0x3f3267(0x18e),'h':'hour(s)'},_0x12de0a=['ms','s','m','h'],_0x3d8c4d=[-0x1,0x0],_0x5e938b=_0x343073=>typeof _0x343073===_0x3f3267(0x2b6)&&_0x343073 in _0x372d5e;function _0x4b745d(_0x13396d,_0x2f3948,_0x2fc5c8=_0x12de0a,_0x437a5d='ms'){const _0x2c339f=_0x3f3267;var _0x28e6c6;if(!Number[_0x2c339f(0x254)](_0x13396d)||_0x13396d<=0x0)return _0x437a5d;if(_0x5e938b(_0x2f3948)&&_0x2f3948!==_0x437a5d&&_0x13396d%_0x372d5e[_0x2f3948]===0x0)return _0x2f3948;const _0x5f21a3=[..._0x2fc5c8][_0x2c339f(0x16f)]((_0xc00f86,_0x480ea8)=>_0x372d5e[_0x480ea8]-_0x372d5e[_0xc00f86]);return(_0x28e6c6=_0x5f21a3['find'](_0x435563=>_0x13396d%_0x372d5e[_0x435563]===0x0))!==null&&_0x28e6c6!==void 0x0?_0x28e6c6:_0x437a5d;}function _0x30e42c(_0x515b87,_0x13efb9=_0x12de0a){const _0x58b8a5=_0x3f3267;if(_0x515b87[_0x58b8a5(0x28e)](_0x58b8a5(0x18c))[_0x58b8a5(0x1fc)]>0x0)return;for(const _0x2ea338 of _0x13efb9){$(_0x58b8a5(0x1f1),{'value':_0x2ea338})[_0x58b8a5(0x2ed)](_0x18c49b[_0x2ea338])[_0x58b8a5(0x1b7)](_0x515b87);}}function _0x447dc8(_0x10d156,_0x377ba4,_0x57ffc2,_0x5b5bfc,_0x4c4a0a={}){const _0x1eadb7=_0x3f3267;var _0x8728fa,_0x5ae601,_0x21bbb1;const _0x103a7b=(_0x8728fa=_0x4c4a0a['units'])!==null&&_0x8728fa!==void 0x0?_0x8728fa:_0x12de0a,_0x1eca8b=(_0x5ae601=_0x4c4a0a[_0x1eadb7(0x26b)])!==null&&_0x5ae601!==void 0x0?_0x5ae601:'ms',_0x1e221b=(_0x21bbb1=_0x4c4a0a['sentinels'])!==null&&_0x21bbb1!==void 0x0?_0x21bbb1:_0x3d8c4d;_0x30e42c(_0x377ba4,_0x103a7b);const _0x3a90b9=()=>{const _0x21a063=_0x377ba4['val']();return _0x5e938b(_0x21a063)?_0x21a063:_0x1eca8b;},_0xefc770=()=>{const _0x28224e=_0x1eadb7,_0x4fca2a=_0x57ffc2();if(!Number[_0x28224e(0x254)](_0x4fca2a)||_0x4fca2a<=0x0||_0x1e221b[_0x28224e(0x28b)](_0x4fca2a)){_0x377ba4[_0x28224e(0x1cd)](_0x1eca8b),_0x10d156[_0x28224e(0x1cd)](Number[_0x28224e(0x254)](_0x4fca2a)?_0x4fca2a:0x0);return;}const _0x285bf2=_0x4b745d(_0x4fca2a,_0x377ba4['val'](),_0x103a7b,_0x1eca8b);_0x377ba4[_0x28224e(0x1cd)](_0x285bf2),_0x10d156[_0x28224e(0x1cd)](_0x4fca2a/_0x372d5e[_0x285bf2]);},_0x11983f=()=>{const _0x36994a=_0x1eadb7,_0x2dc00c=parseFloat(_0x10d156[_0x36994a(0x1cd)]()||'0');if(!Number[_0x36994a(0x254)](_0x2dc00c)){_0x5b5bfc(0x0);return;}if(_0x2dc00c<=0x0||_0x1e221b['includes'](_0x2dc00c)){_0x377ba4[_0x36994a(0x1cd)](_0x1eca8b),_0x5b5bfc(_0x2dc00c);return;}_0x5b5bfc(_0x2dc00c*_0x372d5e[_0x3a90b9()]);},_0x466d8d=()=>{const _0x314ed9=_0x1eadb7,_0x17e842=_0x57ffc2();Number[_0x314ed9(0x254)](_0x17e842)&&_0x17e842>0x0&&!_0x1e221b[_0x314ed9(0x28b)](_0x17e842)&&_0x10d156[_0x314ed9(0x1cd)](_0x17e842/_0x372d5e[_0x3a90b9()]);};return _0x10d156['on'](_0x1eadb7(0x24b),_0x11983f),_0x377ba4['on'](_0x1eadb7(0x21e),_0x466d8d),_0xefc770(),{'refresh':_0xefc770,'destroy'(){const _0xf416ed=_0x1eadb7;_0x10d156[_0xf416ed(0x1fe)](_0xf416ed(0x1e3)),_0x377ba4['off'](_0xf416ed(0x1e3));}};}function _0x581d19(_0x5f0371,_0x5cbdc5={}){const _0x3e5a95=_0x3f3267,_0x287f18=$(_0x3e5a95(0x248)+_0x5f0371),_0x20446f=$(_0x3e5a95(0x248)+_0x5f0371+'-display'),_0xb3448d=$(_0x3e5a95(0x248)+_0x5f0371+_0x3e5a95(0x177));return _0x5e938b(_0x5cbdc5[_0x3e5a95(0x210)])&&_0xb3448d[_0x3e5a95(0x1cd)](_0x5cbdc5[_0x3e5a95(0x210)]),_0x447dc8(_0x20446f,_0xb3448d,()=>parseFloat(_0x287f18[_0x3e5a95(0x1cd)]()||'0'),_0x4b9616=>_0x287f18[_0x3e5a95(0x1cd)](_0x4b9616),_0x5cbdc5);}function _0x50baa8(_0x21c8ab,_0x54af0f,_0x4ff881='ms'){const _0x102628=_0x3f3267;return{[_0x21c8ab]:{'value':_0x54af0f,'required':!![]},[_0x21c8ab+_0x102628(0x177)]:{'value':_0x4ff881}};}function _0x4377bd(_0x562bac){const _0x2b92b5=_0x3f3267;!_0x562bac[_0x2b92b5(0x28d)]('/')&&(_0x562bac='/'+_0x562bac);const _0x3d10f0=_0x2b92b5(0x2db);let _0x36810f=RED[_0x2b92b5(0x153)][_0x3d10f0];if(!_0x36810f){const _0x4b922d=Object[_0x2b92b5(0x158)](RED['settings'])['sort']()[_0x2b92b5(0x2c2)](',\x20');console[_0x2b92b5(0x287)](_0x2b92b5(0x2ba)+_0x3d10f0+_0x2b92b5(0x235)+_0x4b922d),_0x36810f=_0x2b92b5(0x2b2);}const _0x312610=RED[_0x2b92b5(0x153)]['apiRootUrl']||'',_0xb63cc=''+_0x312610+_0x36810f+_0x562bac;return _0xb63cc;}const _0x1a6f40=()=>{const _0xf37b25=_0x3f3267,_0x12b3fb=$('.red-ui-tray-body');if(_0x12b3fb['length']){const _0xf76dd3=$(_0xf37b25(0x18b),{'src':_0x4377bd(_0xf37b25(0x2d0)),'scrolling':'no','style':_0xf37b25(0x281),'allowtransparency':_0xf37b25(0x114),'width':_0xf37b25(0x1d8),'height':_0xf37b25(0x2a1)});_0x12b3fb[_0xf37b25(0x2b9)](_0xf76dd3),_0xf76dd3[_0xf37b25(0x13a)]({'position':_0xf37b25(0x251),'right':_0xf37b25(0x11b),'bottom':_0xf37b25(0x293)});}},_0x2cd7e8=()=>{const _0x532993=_0x3f3267,_0x445fd1=$(_0x532993(0x255)),_0x4dbf52=_0x445fd1['val'](),_0x12196b=RED['nodes'][_0x532993(0x175)](_0x4dbf52);if(!_0x12196b)return undefined;const {endpoint:_0x592384,securityMode:_0x3d36bc,securityPolicy:_0x4fd73a,userIdentityType:_0x4c1cce,credentials:_0x109931,namespaceAliases:_0x325144}=_0x12196b,_0x293c59={'endpoint':_0x592384,'securityMode':_0x3d36bc,'securityPolicy':_0x4fd73a,'userIdentityType':_0x4c1cce,'credentials':_0x109931,'namespaceAliases':_0x325144};return _0x293c59;},_0x3945d4=()=>{const _0x8b5815=_0x3f3267,_0x3f2ab0=$('#node-input-endpoint'),_0x25b7c8=_0x3f2ab0[_0x8b5815(0x1cd)](),_0x1a208a=_0x2cd7e8();if(!_0x1a208a)return undefined;const _0x7eadde=_0x1a208a[_0x8b5815(0x23c)];return Object[_0x8b5815(0x2e4)]({'namespaceAliases':_0x7eadde,'id':_0x25b7c8},_0x1a208a);},_0x38149b=()=>{return{'endpointNode':_0x3945d4};};function _0x86772c(_0x24f750,_0x38538b,_0x37a393,_0x5da6cb){function _0x53fb0a(_0x425033){return _0x425033 instanceof _0x37a393?_0x425033:new _0x37a393(function(_0x84df3){_0x84df3(_0x425033);});}return new(_0x37a393||(_0x37a393=Promise))(function(_0x4dd313,_0x16deee){const _0x27f20e=_0x295a;function _0xd8c033(_0xc21f77){const _0x1e8b8e=_0x295a;try{_0x57f93f(_0x5da6cb[_0x1e8b8e(0x137)](_0xc21f77));}catch(_0x513cb7){_0x16deee(_0x513cb7);}}function _0xa44972(_0x56ab4b){try{_0x57f93f(_0x5da6cb['throw'](_0x56ab4b));}catch(_0x1bd05f){_0x16deee(_0x1bd05f);}}function _0x57f93f(_0xd4ae31){const _0x2a7af9=_0x295a;_0xd4ae31[_0x2a7af9(0x115)]?_0x4dd313(_0xd4ae31[_0x2a7af9(0x10e)]):_0x53fb0a(_0xd4ae31[_0x2a7af9(0x10e)])[_0x2a7af9(0x17b)](_0xd8c033,_0xa44972);}_0x57f93f((_0x5da6cb=_0x5da6cb[_0x27f20e(0x27e)](_0x24f750,_0x38538b||[]))[_0x27f20e(0x137)]());});}typeof SuppressedError==='function'?SuppressedError:function(_0x43eac5,_0x3354af,_0x6831b){var _0x485f4d=new Error(_0x6831b);return _0x485f4d['name']='SuppressedError',_0x485f4d['error']=_0x43eac5,_0x485f4d['suppressed']=_0x3354af,_0x485f4d;};function _0x170695(){return _0x86772c(this,void 0x0,void 0x0,function*(){const _0x48f25a=_0x295a,_0x5d1f30=_0x4377bd(_0x48f25a(0x25b)),_0x43118d=yield fetch(_0x5d1f30,{'method':_0x48f25a(0x294)}),_0x2b50b4=new Date()[_0x48f25a(0x1d4)](),_0x515e67={'status':_0x48f25a(0x277),'type':_0x48f25a(0x10b),'productName':_0x48f25a(0x14d),'productVersion':_0x48f25a(0x138),'licenceInfo':{'licenceId':'00000000-0000-0000-0000-000000000000','licenceType':_0x48f25a(0x11d),'expiryDate':_0x2b50b4,'onPremiseServerHost':'','expired':!![],'userCompany':'','userEmail':'','userName':''}};if(_0x43118d[_0x48f25a(0x2c8)]!==0xc8)return console[_0x48f25a(0x2e1)](_0x48f25a(0x2a2),_0x43118d[_0x48f25a(0x2c8)],_0x43118d['statusText']),_0x515e67;const _0x446e3f=yield _0x43118d[_0x48f25a(0x295)]();return _0x446e3f;});}const _0x101a6e=_0x3f3267(0x285);function _0x32c332(){return _0x86772c(this,void 0x0,void 0x0,function*(){const _0x84e42e=_0x295a;try{const _0x4272a9=_0x4377bd(_0x84e42e(0x22e)),_0x1eaf0d=yield fetch(_0x4272a9);if(!_0x1eaf0d['ok'])return{'onboarded':!![]};return yield _0x1eaf0d[_0x84e42e(0x295)]();}catch(_0x5cb348){return{'onboarded':!![]};}});}function _0x249836(_0x410f1e){const _0x530df6=_0x3f3267;_0x2052ff({'bannerClass':_0x530df6(0x265),'bannerCss':{'backgroundColor':'#fff3cd','borderBottom':_0x530df6(0x208)},'messageHtml':_0x530df6(0x14b)+_0x530df6(0x195)+(_0x530df6(0x24c)+_0x410f1e+_0x530df6(0x2c3))+_0x530df6(0x2dc)+_0x530df6(0x1f6),'messageCss':{'color':_0x530df6(0x16c)},'buttonText':_0x530df6(0x2e5),'buttonCss':{'backgroundColor':'#ff9800'},'buttonHoverCss':{'backgroundColor':_0x530df6(0x1a1)},'supportUrl':_0x410f1e});const _0xb0b4f7=setInterval(()=>_0x86772c(this,void 0x0,void 0x0,function*(){const _0x238b37=_0x530df6;try{const _0x2fa257=yield _0x32c332();if(_0x2fa257[_0x238b37(0x20e)]){clearInterval(_0xb0b4f7);const _0x3b6d76=$('.onboarding-required-banner');_0x3b6d76['length']>0x0&&(_0x3b6d76[_0x238b37(0x13a)]({'backgroundColor':'#d4edda','borderBottom':_0x238b37(0x2b1)}),_0x3b6d76[_0x238b37(0x1a7)](_0x238b37(0x1bb))[_0x238b37(0x123)](_0x238b37(0x2ce)+_0x238b37(0x222)),_0x3b6d76['find'](_0x238b37(0x1bb))[_0x238b37(0x13a)]({'color':_0x238b37(0x2be)}),_0x3b6d76['find'](_0x238b37(0x252))['remove'](),setTimeout(()=>{const _0x135897=_0x238b37;_0x3b6d76[_0x135897(0x1db)](0x12c,()=>_0x3b6d76[_0x135897(0x283)]());},0x1388));}}catch(_0x1f933b){}}),0xbb8),_0x4355ed=new MutationObserver(()=>{const _0x5e2c52=_0x530df6;$(_0x5e2c52(0x291))[_0x5e2c52(0x1fc)]===0x0&&(clearInterval(_0xb0b4f7),_0x4355ed[_0x5e2c52(0x20d)]());}),_0xb1ac7a=$(_0x530df6(0x29d))[_0x530df6(0x1de)]();_0xb1ac7a[_0x530df6(0x1fc)]>0x0&&_0xb1ac7a[0x0]&&_0x4355ed[_0x530df6(0x22c)](_0xb1ac7a[0x0],{'childList':!![],'subtree':!![]});}function _0x5afeb3(){return _0x86772c(this,arguments,void 0x0,function*(_0x4f0823={}){const _0x1a6f08=_0x295a,_0xf074d1=_0x4377bd(_0x1a6f08(0x1d0)),{delay:delay=0x5dc,supportUrl:supportUrl=_0xf074d1,shouldShowOverlay:shouldShowOverlay=_0x4aa488=>_0x4aa488[_0x1a6f08(0x2c8)]===_0x1a6f08(0x214)&&_0x4aa488[_0x1a6f08(0x1c8)]===_0x1a6f08(0x2a9)}=_0x4f0823;try{const _0xbdd417=yield _0x32c332();if(!_0xbdd417[_0x1a6f08(0x20e)])return yield _0x4d03bb(Math[_0x1a6f08(0x165)](delay,0x1f4)),_0x249836(_0x4377bd(_0x1a6f08(0x1e6))),!![];const _0x138bfe=yield _0x170695();if(shouldShowOverlay(_0x138bfe)){const _0x2638df=Date[_0x1a6f08(0x2f0)](),_0x4cbe64=parseInt(localStorage[_0x1a6f08(0x1bc)](_0x101a6e)||'0',0xa),_0x132b65=0x3c*0x3c*0x3e8;return _0x2638df-_0x4cbe64>_0x132b65?(yield _0x4d03bb(delay),_0x4eec42(supportUrl),localStorage[_0x1a6f08(0x280)](_0x101a6e,_0x2638df[_0x1a6f08(0x27b)]())):_0x4d4d02(supportUrl),!![];}if(_0x138bfe['type']===_0x1a6f08(0x2a9)&&_0x138bfe['status']!==_0x1a6f08(0x214)){const _0x590d87=_0x24c803(_0x138bfe);if(_0x590d87<=0xa&&_0x590d87>0x0)return yield _0x4d03bb(delay),_0x37522d(supportUrl,_0x590d87),!![];}if(_0x138bfe[_0x1a6f08(0x1c8)]===_0x1a6f08(0x16b)&&_0x138bfe[_0x1a6f08(0x2c8)]===_0x1a6f08(0x214))return yield _0x4d03bb(delay),_0x2504c6(supportUrl),!![];return![];}catch(_0x54ca40){return console[_0x1a6f08(0x233)]('Failed\x20to\x20check\x20licence\x20status:',_0x54ca40),![];}});}function _0x4eec42(_0x1946a5,_0x3e4941=0xbb8){const _0x5684ae=_0x3f3267,_0xd2de96=$('.red-ui-tray-content')[_0x5684ae(0x1de)]();if(_0xd2de96[_0x5684ae(0x1fc)]===0x0){console[_0x5684ae(0x287)](_0x5684ae(0x219));return;}const _0x3cfe27=$('<div>',{'class':_0x5684ae(0x1f9),'css':{'position':_0x5684ae(0x251),'top':0x0,'left':0x0,'right':0x0,'bottom':0x0,'zIndex':0x2710,'backgroundColor':_0xd2de96[_0x5684ae(0x13a)]('background-color')[_0x5684ae(0x269)]('rgb(',_0x5684ae(0x1f0))[_0x5684ae(0x269)](')',',\x200.7)'),'backdropFilter':_0x5684ae(0x20b),'WebkitBackdropFilter':_0x5684ae(0x20b),'display':_0x5684ae(0x2ee),'flexDirection':_0x5684ae(0x26c),'alignItems':_0x5684ae(0x229),'justifyContent':_0x5684ae(0x229),'padding':_0x5684ae(0x2df)}}),_0x3d9ca0=$(_0x5684ae(0x2d4),{'css':{'backgroundColor':_0x5684ae(0x1d2),'backdropFilter':_0x5684ae(0x215),'WebkitBackdropFilter':_0x5684ae(0x215),'borderRadius':_0x5684ae(0x293),'padding':'40px','maxWidth':'500px','textAlign':_0x5684ae(0x229),'boxShadow':'0\x2020px\x2050px\x20rgba(0,0,0,0.25)','border':_0x5684ae(0x2c0)}}),_0x276819=$(_0x5684ae(0x145),{'src':_0x4377bd(_0x5684ae(0x20f)),'css':{'maxWidth':_0x5684ae(0x249),'height':_0x5684ae(0x1dd),'marginBottom':_0x5684ae(0x11b)}}),_0xfc87cf=$(_0x5684ae(0x2d4),{'css':{'fontSize':'64px','marginBottom':_0x5684ae(0x11b)}})[_0x5684ae(0x2ed)]('⚠️'),_0x1b7311=$(_0x5684ae(0x268),{'css':{'color':_0x5684ae(0x2dd),'fontSize':'24px','fontWeight':'bold','marginBottom':_0x5684ae(0x11e)}})[_0x5684ae(0x2ed)]('Trial\x20License\x20Expired'),_0x3b7fa0=$(_0x5684ae(0x12f),{'css':{'color':_0x5684ae(0x1c5),'fontSize':'16px','lineHeight':_0x5684ae(0x200),'marginBottom':_0x5684ae(0x2ac)}})[_0x5684ae(0x123)](_0x5684ae(0x2a5)),_0x4c0d4e=$(_0x5684ae(0x140),{'css':{'backgroundColor':_0x5684ae(0x17a),'color':_0x5684ae(0x292),'border':'none','padding':_0x5684ae(0x2cd),'fontSize':_0x5684ae(0x293),'fontWeight':_0x5684ae(0x282),'borderRadius':_0x5684ae(0x2c7),'cursor':_0x5684ae(0x135),'marginBottom':_0x5684ae(0x11e),'width':_0x5684ae(0x2a3),'transition':_0x5684ae(0x2b3)}})[_0x5684ae(0x2ed)](_0x5684ae(0x19d))['on'](_0x5684ae(0x152),function(){const _0x492038=_0x5684ae;$(this)[_0x492038(0x13a)](_0x492038(0x204),_0x492038(0x26e));})['on'](_0x5684ae(0x139),function(){const _0x562fc1=_0x5684ae;$(this)[_0x562fc1(0x13a)](_0x562fc1(0x204),_0x562fc1(0x17a));})['on']('click',()=>{const _0x21595b=_0x5684ae;window[_0x21595b(0x2bd)](_0x1946a5,_0x21595b(0x25f),_0x21595b(0x201));}),_0x3ff945=$('<button>',{'class':'licence-continue-button','css':{'backgroundColor':'transparent','color':_0x5684ae(0x227),'border':_0x5684ae(0x1b1),'padding':_0x5684ae(0x186),'fontSize':_0x5684ae(0x16d),'borderRadius':_0x5684ae(0x2c7),'cursor':_0x5684ae(0x135),'marginTop':_0x5684ae(0x1bf),'width':_0x5684ae(0x2a3),'transition':_0x5684ae(0x2ea),'display':_0x5684ae(0x271)}})[_0x5684ae(0x2ed)](_0x5684ae(0x2de))['on']('mouseenter',function(){const _0x2aad95=_0x5684ae;$(this)[_0x2aad95(0x13a)]({'backgroundColor':_0x2aad95(0x1d1),'borderColor':_0x2aad95(0x193)});})['on']('mouseleave',function(){const _0x5b3d0f=_0x5684ae;$(this)[_0x5b3d0f(0x13a)]({'backgroundColor':_0x5b3d0f(0x238),'borderColor':'#ccc'});})['on']('click',()=>{const _0x219c92=_0x5684ae;_0x3cfe27[_0x219c92(0x226)](0x12c,()=>{const _0x42da00=_0x219c92;_0x3cfe27[_0x42da00(0x283)]();});});setTimeout(()=>{const _0x398785=_0x5684ae;_0x3ff945[_0x398785(0x1e2)]();},_0x3e4941),_0x3d9ca0['append'](_0x276819),_0x3d9ca0[_0x5684ae(0x2b9)](_0xfc87cf),_0x3d9ca0[_0x5684ae(0x2b9)](_0x1b7311),_0x3d9ca0[_0x5684ae(0x2b9)](_0x3b7fa0),_0x3d9ca0[_0x5684ae(0x2b9)](_0x4c0d4e),_0x3d9ca0[_0x5684ae(0x2b9)](_0x3ff945),_0x3cfe27[_0x5684ae(0x2b9)](_0x3d9ca0),_0xd2de96['css'](_0x5684ae(0x19b),_0x5684ae(0x2e8)),_0xd2de96[_0x5684ae(0x2b9)](_0x3cfe27),window[_0x5684ae(0x266)](_0x5684ae(0x2d7),function _0x516f89(_0x53287d){const _0x1029ac=_0x5684ae;_0x53287d[_0x1029ac(0x2f3)]&&_0x53287d[_0x1029ac(0x2f3)][_0x1029ac(0x1c8)]===_0x1029ac(0x17d)&&(_0x3cfe27[_0x1029ac(0x226)](0x12c,()=>{_0x3cfe27['remove']();}),window[_0x1029ac(0x221)](_0x1029ac(0x2d7),_0x516f89));});}function _0x4d03bb(_0x51c489){return new Promise(_0x4f57d5=>setTimeout(_0x4f57d5,_0x51c489));}function _0x24c803(_0x481b4c){const _0x350c07=_0x3f3267,_0xf9fc02=_0x481b4c[_0x350c07(0x20c)][_0x350c07(0x1da)];if(!_0xf9fc02||_0xf9fc02==='permanent')return Infinity;const _0x11e8b2=new Date(_0xf9fc02),_0x299046=new Date(),_0x2821c8=_0x11e8b2[_0x350c07(0x272)]()-_0x299046[_0x350c07(0x272)](),_0xbc0ebf=Math[_0x350c07(0x11a)](_0x2821c8/(0x3e8*0x3c*0x3c*0x18));return _0xbc0ebf;}function _0x37522d(_0x3e128a,_0x5d3aa6){const _0x2bb237=_0x3f3267,_0x252b56=$(_0x2bb237(0x29d))[_0x2bb237(0x1de)]();if(_0x252b56[_0x2bb237(0x1fc)]===0x0){console[_0x2bb237(0x287)](_0x2bb237(0x2d1));return;}if(_0x252b56[_0x2bb237(0x1a7)](_0x2bb237(0x118))[_0x2bb237(0x1fc)]>0x0)return;const _0x3cbdb4=$(_0x2bb237(0x2d4),{'class':_0x2bb237(0x17c),'css':{'position':'relative','backgroundColor':_0x2bb237(0x22d),'borderBottom':_0x2bb237(0x124),'padding':_0x2bb237(0x21b),'display':_0x2bb237(0x2ee),'alignItems':_0x2bb237(0x229),'gap':'12px','boxShadow':_0x2bb237(0x243),'zIndex':0x3e8}}),_0x36577a=$('<div>',{'css':{'fontSize':_0x2bb237(0x11b),'flexShrink':0x0}})['text']('⚠️'),_0x100f06=$(_0x2bb237(0x2d4),{'css':{'flex':0x1,'fontSize':_0x2bb237(0x16d),'color':'#856404'}}),_0x116e0e=$(_0x2bb237(0x261),{'css':{'fontWeight':_0x2bb237(0x1ff)}})[_0x2bb237(0x123)](_0x2bb237(0x2da)+_0x5d3aa6+_0x2bb237(0x155)+(_0x5d3aa6!==0x1?'s':'')+_0x2bb237(0x246)),_0x751788=$(_0x2bb237(0x1e9),{'href':'#','css':{'color':_0x2bb237(0x17a),'textDecoration':_0x2bb237(0x169),'cursor':'pointer'}})[_0x2bb237(0x2ed)](_0x2bb237(0x18d))['on'](_0x2bb237(0x2c6),_0x29646a=>{const _0x5e2fcc=_0x2bb237;_0x29646a[_0x5e2fcc(0x247)](),window['open'](_0x3e128a,'_blank','width=1200,height=800');});_0x100f06[_0x2bb237(0x2b9)](_0x116e0e),_0x100f06[_0x2bb237(0x2b9)](_0x751788);const _0x7e7a2c=$(_0x2bb237(0x140),{'css':{'position':_0x2bb237(0x251),'right':'10px','top':_0x2bb237(0x2b7),'transform':_0x2bb237(0x23b),'backgroundColor':_0x2bb237(0x238),'border':'none','fontSize':_0x2bb237(0x11b),'color':'#856404','cursor':'pointer','padding':_0x2bb237(0x23e),'lineHeight':0x1,'opacity':0.7,'transition':_0x2bb237(0x209)}})[_0x2bb237(0x123)](_0x2bb237(0x2ad))['on'](_0x2bb237(0x152),function(){const _0xaa60bd=_0x2bb237;$(this)[_0xaa60bd(0x13a)]('opacity',0x1);})['on'](_0x2bb237(0x139),function(){$(this)['css']('opacity',0.7);})['on'](_0x2bb237(0x2c6),()=>{const _0x34ea53=_0x2bb237;_0x3cbdb4[_0x34ea53(0x1db)](0xc8,()=>{const _0x1784b5=_0x34ea53;_0x3cbdb4[_0x1784b5(0x283)]();});});_0x3cbdb4[_0x2bb237(0x2b9)](_0x36577a),_0x3cbdb4[_0x2bb237(0x2b9)](_0x100f06),_0x3cbdb4[_0x2bb237(0x2b9)](_0x7e7a2c),_0x252b56['prepend'](_0x3cbdb4);}function _0x2052ff(_0x17d338){const _0x40f984=_0x3f3267,_0x1d7b3f=$(_0x40f984(0x29d))[_0x40f984(0x1de)]();if(_0x1d7b3f[_0x40f984(0x1fc)]===0x0){console[_0x40f984(0x287)](_0x40f984(0x236)+_0x17d338[_0x40f984(0x1ef)]);return;}if(_0x1d7b3f[_0x40f984(0x1a7)]('.'+_0x17d338[_0x40f984(0x1ef)])['length']>0x0)return;const _0x3f00b8=$(_0x40f984(0x2d4),{'class':_0x17d338['bannerClass'],'css':Object[_0x40f984(0x2e4)]({'position':'relative','padding':_0x40f984(0x1ba),'display':_0x40f984(0x2ee),'alignItems':_0x40f984(0x229),'justifyContent':'space-between','gap':_0x40f984(0x11e),'zIndex':0x3e8},_0x17d338[_0x40f984(0x299)])}),_0x35396d=$('<div>',{'css':Object[_0x40f984(0x2e4)]({'fontSize':_0x40f984(0x16d)},_0x17d338[_0x40f984(0x2e3)])}),_0x3ee57a=$(_0x40f984(0x261))['html'](_0x17d338[_0x40f984(0x1b5)]);_0x35396d[_0x40f984(0x2b9)](_0x3ee57a);const _0x24a676=$(_0x40f984(0x140),{'css':Object[_0x40f984(0x2e4)]({'color':_0x40f984(0x292),'border':_0x40f984(0x271),'padding':_0x40f984(0x199),'fontSize':_0x40f984(0x146),'fontWeight':_0x40f984(0x282),'borderRadius':_0x40f984(0x211),'cursor':_0x40f984(0x135),'flexShrink':0x0,'transition':'background-color\x200.2s'},_0x17d338[_0x40f984(0x1a6)])})['text'](_0x17d338[_0x40f984(0x2a0)])['on'](_0x40f984(0x152),function(){const _0x51e226=_0x40f984;$(this)['css'](_0x17d338[_0x51e226(0x2ae)]);})['on']('mouseleave',function(){const _0xd6ae57=_0x40f984;$(this)[_0xd6ae57(0x13a)](_0x17d338[_0xd6ae57(0x1a6)]);})['on'](_0x40f984(0x2c6),_0x1ac2e8=>{const _0x487345=_0x40f984;_0x1ac2e8[_0x487345(0x247)](),window[_0x487345(0x2bd)](_0x17d338[_0x487345(0x121)],_0x487345(0x25f),_0x487345(0x201));});_0x3f00b8[_0x40f984(0x2b9)](_0x35396d),_0x3f00b8[_0x40f984(0x2b9)](_0x24a676),_0x1d7b3f[_0x40f984(0x1ec)](_0x3f00b8);}function _0x4d4d02(_0x3b82b5){const _0x1de43f=_0x3f3267;_0x2052ff({'bannerClass':'licence-freemium-banner','bannerCss':{'backgroundColor':_0x1de43f(0x1a9),'borderBottom':'1px\x20solid\x20#ced4da'},'messageHtml':_0x1de43f(0x22f),'messageCss':{'color':_0x1de43f(0x263)},'buttonText':'Upgrade','buttonCss':{'backgroundColor':_0x1de43f(0x17a)},'buttonHoverCss':{'backgroundColor':_0x1de43f(0x26e)},'supportUrl':_0x3b82b5});}function _0x2504c6(_0x5d7c78){const _0x5d943f=_0x3f3267;_0x2052ff({'bannerClass':_0x5d943f(0x1c6),'bannerCss':{'backgroundColor':'#f8d7da','borderBottom':_0x5d943f(0x180)},'messageHtml':_0x5d943f(0x1bd),'messageCss':{'color':_0x5d943f(0x2b8)},'buttonText':_0x5d943f(0x276),'buttonCss':{'backgroundColor':_0x5d943f(0x1e4)},'buttonHoverCss':{'backgroundColor':_0x5d943f(0x213)},'supportUrl':_0x5d7c78});}const _0x2256a0=_0x3f3267(0x28f),_0x47d24c=_0x3f3267(0x224),_0x1b1c5a=_0x3f3267(0x128),_0x53c5fa=_0x3f3267(0x1f7),_0x2a4ef1=_0x3f3267(0x1dc),_0x29da94=_0x3f3267(0x19c),_0x3d376c=_0x3f3267(0x1d5);var _0x1747a4;(function(_0x14f363){const _0x4a7611=_0x3f3267;_0x14f363[_0x14f363['Forward']=0x0]=_0x4a7611(0x273),_0x14f363[_0x14f363['Inverse']=0x1]='Inverse',_0x14f363[_0x14f363['Both']=0x2]=_0x4a7611(0x19f),_0x14f363[_0x14f363[_0x4a7611(0x253)]=0x3]=_0x4a7611(0x253);}(_0x1747a4||(_0x1747a4={})));var _0x3db6d8;(function(_0x5879f7){const _0x4d011a=_0x3f3267;_0x5879f7[_0x5879f7[_0x4d011a(0x111)]=0x0]=_0x4d011a(0x111),_0x5879f7[_0x5879f7[_0x4d011a(0x1e8)]=0x1]=_0x4d011a(0x1e8),_0x5879f7[_0x5879f7[_0x4d011a(0x26f)]=0x2]=_0x4d011a(0x26f),_0x5879f7[_0x5879f7[_0x4d011a(0x284)]=0x4]=_0x4d011a(0x284),_0x5879f7[_0x5879f7[_0x4d011a(0x25e)]=0x8]=_0x4d011a(0x25e),_0x5879f7[_0x5879f7[_0x4d011a(0x14e)]=0x10]=_0x4d011a(0x14e),_0x5879f7[_0x5879f7['ReferenceType']=0x20]=_0x4d011a(0x1df),_0x5879f7[_0x5879f7[_0x4d011a(0x1cc)]=0x40]=_0x4d011a(0x1cc),_0x5879f7[_0x5879f7[_0x4d011a(0x27c)]=0x80]='View';}(_0x3db6d8||(_0x3db6d8={})));var _0x1bd120;(function(_0x70d97f){const _0x2afce9=_0x3f3267;_0x70d97f[_0x70d97f[_0x2afce9(0x1e8)]=0x1]='Object',_0x70d97f[_0x70d97f[_0x2afce9(0x26f)]=0x2]=_0x2afce9(0x26f),_0x70d97f[_0x70d97f[_0x2afce9(0x284)]=0x4]=_0x2afce9(0x284),_0x70d97f[_0x70d97f[_0x2afce9(0x25e)]=0x8]=_0x2afce9(0x25e),_0x70d97f[_0x70d97f[_0x2afce9(0x14e)]=0x10]=_0x2afce9(0x14e),_0x70d97f[_0x70d97f[_0x2afce9(0x1df)]=0x20]=_0x2afce9(0x1df),_0x70d97f[_0x70d97f[_0x2afce9(0x1cc)]=0x40]=_0x2afce9(0x1cc),_0x70d97f[_0x70d97f[_0x2afce9(0x27c)]=0x80]=_0x2afce9(0x27c);}(_0x1bd120||(_0x1bd120={})));var _0x288798;(function(_0x1274ac){const _0x3f88ac=_0x3f3267;_0x1274ac[_0x1274ac['ReferenceType']=0x1]=_0x3f88ac(0x1df),_0x1274ac[_0x1274ac['IsForward']=0x2]=_0x3f88ac(0x274),_0x1274ac[_0x1274ac[_0x3f88ac(0x1fb)]=0x4]=_0x3f88ac(0x1fb),_0x1274ac[_0x1274ac[_0x3f88ac(0x164)]=0x8]=_0x3f88ac(0x164),_0x1274ac[_0x1274ac['DisplayName']=0x10]=_0x3f88ac(0x2a6),_0x1274ac[_0x1274ac[_0x3f88ac(0x143)]=0x20]=_0x3f88ac(0x143);}(_0x288798||(_0x288798={})));function _0x59e9ae(_0x3dce08){const _0x18bd80=_0x3f3267;switch(_0x3dce08){case _0x18bd80(0x290):return _0x2256a0;case _0x18bd80(0x196):return _0x53c5fa;case _0x18bd80(0x23a):return _0x1b1c5a;case _0x18bd80(0x1fd):return _0x2a4ef1;case _0x18bd80(0x14a):return _0x29da94;case _0x18bd80(0x134):return _0x3d376c;}}const _0x2ffcc5=(_0x4dd6e8,_0x2c78da,_0x149c80)=>_0x86772c(void 0x0,[_0x4dd6e8,_0x2c78da,_0x149c80],void 0x0,function*({endpointNode:_0x4962f5,endpoint:_0x1c026c},_0x336b39,_0x2e6b93){const _0x276778=_0x3f3267,_0x2cc63a=Object[_0x276778(0x2e4)](Object[_0x276778(0x2e4)]({},_0x2e6b93),{'nodeId':_0x336b39,'resultMask':0x3f}),_0x1c141b=_0x4377bd(_0x276778(0x194)),_0x599514=yield fetch(_0x1c141b,{'method':_0x276778(0x147),'body':JSON[_0x276778(0x257)]({'endpointNode':_0x4962f5,'endpoint':_0x1c026c,'browseDescription':_0x2cc63a}),'headers':{'Content-Type':_0x276778(0x119)}});if(_0x599514['status']!==0xc8)return console[_0x276778(0x2e1)]('fetching\x20failed\x20with\x20error',_0x599514['status'],_0x599514['statusText']),{'references':[]};const _0x1aa8a6=yield _0x599514[_0x276778(0x295)](),_0x3713be=_0x1aa8a6[_0x276778(0x25c)]['references']||[];return{'references':_0x3713be};}),_0x4b3f98=_0xeeb49b=>{const _0x110134=_0x3f3267;switch(_0xeeb49b[_0x110134(0x1f4)]){case _0x110134(0x1e8):if(_0xeeb49b[_0x110134(0x131)]===_0x2256a0);if(_0xeeb49b[_0x110134(0x202)]===_0x47d24c||_0xeeb49b[_0x110134(0x131)]==='i=61')return{'icon':_0x110134(0x289),'color':_0x110134(0x230)};return{'icon':_0x110134(0x117),'color':'SeaGreen'};case _0x110134(0x26f):if(_0xeeb49b[_0x110134(0x131)]===_0x1b1c5a)return{'icon':'fa-list-alt','color':_0x110134(0x206)};else return _0xeeb49b[_0x110134(0x131)]===_0x53c5fa?{'icon':_0x110134(0x191),'color':'DodgerBlue'}:{'icon':'fa-list-alt','color':_0x110134(0x2a7)};case _0x110134(0x284):return{'icon':'fa-cog','color':_0x110134(0x1b0)};case'ObjectType':return{'icon':'fa-object-group','color':_0x110134(0x2c1)};case _0x110134(0x14e):return{'icon':_0x110134(0x2d5),'color':_0x110134(0x2c1)};case _0x110134(0x1cc):return{'icon':_0x110134(0x25a),'color':_0x110134(0x2a7)};}return{'icon':_0x110134(0x144),'color':'grey'};},_0x173a67={'referenceTypeId':_0x59e9ae('HasChild'),'includeSubtypes':!![],'browseDirection':_0x1747a4[_0x3f3267(0x273)],'nodeClassMask':_0x3db6d8[_0x3f3267(0x26f)]|_0x3db6d8[_0x3f3267(0x1e8)]|_0x3db6d8[_0x3f3267(0x284)],'resultMask':0x3f},_0x267e32={'referenceTypeId':_0x59e9ae(_0x3f3267(0x290)),'includeSubtypes':!![],'browseDirection':_0x1747a4['Forward'],'nodeClassMask':_0x3db6d8[_0x3f3267(0x26f)]|_0x3db6d8['Object']|_0x3db6d8[_0x3f3267(0x284)],'resultMask':0x3f},_0x1f67b9=(_0x48ef01,_0x21c7f1)=>_0x86772c(void 0x0,[_0x48ef01,_0x21c7f1],void 0x0,function*({endpointNode:_0x3e2b71,endpoint:_0x2e59d6},{nodeId:_0x1b6ea1,rootNodeId:_0x40439d,isType:_0x8a8843}){const _0x268a11=_0x3f3267,_0x398ec3=_0x4377bd('/walk-backward'),_0x168d06=yield fetch(_0x398ec3,{'method':_0x268a11(0x147),'body':JSON[_0x268a11(0x257)]({'endpointNode':_0x3e2b71,'endpoint':_0x2e59d6,'nodeId':_0x1b6ea1,'rootNodeId':_0x40439d,'isType':_0x8a8843}),'headers':{'Content-Type':_0x268a11(0x119)}});if(_0x168d06[_0x268a11(0x2c8)]!==0xc8)return null;const _0x2a783f=yield _0x168d06['json']();return _0x2a783f[_0x268a11(0x2a8)];}),_0x56096b=(_0x325c61,_0x560806)=>{const _0x3a3459=_0x3f3267;if(_0x325c61[_0x3a3459(0x1ce)]!==_0x3a3459(0x225))return _0x325c61[_0x3a3459(0x23f)];switch(_0x560806){case'browsePath':return _0x325c61[_0x3a3459(0x2e6)];case _0x3a3459(0x21d):return _0x325c61[_0x3a3459(0x1aa)]||_0x325c61[_0x3a3459(0x2e6)];case _0x3a3459(0x260):return _0x325c61[_0x3a3459(0x21c)]||_0x325c61[_0x3a3459(0x2a4)];case _0x3a3459(0x267):return _0x325c61[_0x3a3459(0x2a4)];default:return _0x325c61['nodeId'];}},_0x1195b2=_0x156066=>{const _0x5eeda5=_0x3f3267;if(_0x156066[_0x5eeda5(0x1ce)]!=='Good')return'statusCode:\x20'+_0x156066[_0x5eeda5(0x1ce)];else{const _0x6cb650=[];return _0x6cb650[_0x5eeda5(0x1ab)](_0x5eeda5(0x28a)+_0x156066[_0x5eeda5(0x1d9)]),_0x6cb650[_0x5eeda5(0x1ab)](_0x5eeda5(0x29a)+_0x156066[_0x5eeda5(0x2e6)]),_0x6cb650['push'](_0x5eeda5(0x12