mod additional;
pub(super) mod consts;
mod dolphin_specific;
mod fonts;
mod geolocation;
mod hints;
mod media_devices;
mod navigator;
mod passwords;
mod ports;
mod screen;
mod synchronize;
mod videocard;
mod voices;
pub use additional::Additional;
pub use dolphin_specific::DolphinSpecific;
pub use fonts::Fonts;
pub use geolocation::Geolocation;
pub use hints::Hints;
pub use media_devices::MediaDevices;
pub use navigator::Navigator;
use passwords::Passwords;
pub use ports::PortsProtection;
pub use screen::Screen;
use serde::Deserialize;
pub use serde::Serialize;
pub use synchronize::Synchronize;
pub use videocard::{WebGL, WebGPU};
use voices::SpeechVoices;
pub use voices::Voices;
use crate::server::{
dtos::{
browser_profile_dto::BrowserProfileFullData, start_dto::StartRequest,
},
error::{AppResult, Error},
};
trait FromStartRequest<T> {
fn from_start_request(
bp: &BrowserProfileFullData,
request: &StartRequest,
navigator: &Navigator,
screen: &Screen,
token: &str,
) -> Result<T, Error>;
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct BrowserProfileConfig {
pub additional: Additional,
pub geolocation: Geolocation,
pub screen: Screen,
pub navigator: Navigator,
pub hints: Hints,
pub webgl: WebGL,
#[serde(skip_serializing_if = "Option::is_none")]
pub webgpu: Option<WebGPU>,
pub voices: Voices,
pub speech_voices: SpeechVoices,
pub fonts: Fonts,
pub media_devices: MediaDevices,
pub ports_protection: PortsProtection,
pub dolphin: DolphinSpecific,
#[serde(rename = "synhronize")]
pub synchronize: Synchronize,
#[serde(rename = "passwords_store")]
#[serde(skip_serializing_if = "Option::is_none")]
pub passwords: Option<Passwords>,
}
impl BrowserProfileConfig {
pub fn new(
bp: &BrowserProfileFullData,
request: StartRequest,
token: String,
) -> AppResult<Self> {
let navigator = Navigator::from_start_request(
bp,
&request,
&Default::default(),
&Default::default(),
&token,
)?;
let screen = Screen::from_start_request(
bp,
&request,
&Default::default(),
&Default::default(),
&token,
)?;
Ok(Self {
synchronize: Synchronize::from_start_request(
bp, &request, &navigator, &screen, &token,
)?,
additional: Additional::from_start_request(
bp, &request, &navigator, &screen, &token,
)?,
geolocation: Geolocation::from_start_request(
bp, &request, &navigator, &screen, &token,
)?,
hints: Hints::from_start_request(
bp, &request, &navigator, &screen, &token,
)?,
webgl: WebGL::from_start_request(
bp, &request, &navigator, &screen, &token,
)?,
webgpu: Option::<WebGPU>::from_start_request(
bp, &request, &navigator, &screen, &token,
)?,
voices: Voices::from_start_request(
bp, &request, &navigator, &screen, &token,
)?,
speech_voices: SpeechVoices::from_start_request(
bp, &request, &navigator, &screen, &token,
)?,
fonts: Fonts::from_start_request(
bp, &request, &navigator, &screen, &token,
)?,
media_devices: MediaDevices::from_start_request(
bp, &request, &navigator, &screen, &token,
)?,
ports_protection: PortsProtection::from_start_request(
bp, &request, &navigator, &screen, &token,
)?,
dolphin: DolphinSpecific::from_start_request(
bp, &request, &navigator, &screen, &token,
)?,
passwords: Option::<Passwords>::from_start_request(
bp, &request, &navigator, &screen, &token,
)?,
navigator,
screen,
})
}
pub fn json(&self) -> Result<String, Error> {
serde_json::to_string(self).map_err(Error::SerdeJson)
}
}
#[cfg(test)]
mod tests {
use super::*;
use pretty_assertions::assert_eq;
use voices::Voice;
#[test]
fn test_config_basic_serialize() {
let config = BrowserProfileConfig { additional: Additional { is_chrome_icon: false, accelerated_2d_canvas: true, profile_name: "manual geo".to_string(), rect_noise: 1.0, is_webrtc_enabled: true, webrtc_ip: "77.246.103.64".to_string(), is_windows: true, is_win10: true,is_fake_media: false, profile_icon: 0, is_canvas_blocked: false, ostype: 0, canvas_noise_seed: 0, webgl_noise_seed: 0, extensions_new_naming: true, smart_paste_shift: 1.05, is_real_webrtc: false, is_webrtc_connection_enabled: false, is_webrtc_realtime_ip_update_enabled: true, should_show_profile_name: true }, geolocation: Geolocation { install: true, latitude: 52.3759, longitude: 4.8975, accuracy: 10 }, screen: Screen { is_real: true, width: 1440, height: 900, dpr: 1.0, depth: 24 }, navigator: Navigator { app_code_name: "Mozilla".to_string(), app_name: "Netscape".to_string(), connection: navigator::Connection { downlink: 10.2, effective_type: "4g".to_string(), rtt: 50, save_data: false }, device_memory: 8, do_not_track: false, hardware_concurrency: 4, app_locale: "nl".to_string(), locale: "nl".to_string(), languages: vec!["nl-BE".to_string(), "nl".to_string(), "en-US".to_string(), "en".to_string()], accept_languages: "nl-BE,nl;q=0.9;en-US,en;q=0.8".to_string(), platform: "Win32".to_string(), product: "Gecko".to_string(), product_sub: "20030107".to_string(), user_agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36".to_string(), vendor: "Google Inc.".to_string(), vendor_sub: "".to_string(), timezone: "Europe/Amsterdam".to_string() }, hints: Hints { architecture: "x86".to_string(), bitness: "64".to_string(), model: "".to_string(), platform: "Windows".to_string(), platform_version: "10.0.0".to_string(), ua_full_version: "130.0.6723.92".to_string(), mobile: false, ua_header: "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"91\", \"Google Chrome\";v=\"91\"".to_string(), viewport_width: 1440 }, webgl: WebGL { unmasked_vendor: "Google Inc. (AMD)".to_string(), unmasked_renderer: "ANGLE (AMD, AMD FirePro M6100 Direct3D11 vs_5_0 ps_5_0, D3D11)".to_string(), extra_params: None }, webgpu: Some(WebGPU { vendor: "amd".to_string(), architecture: "gcn-2".to_string(), device: "".to_string(), description: "".to_string(), driver: "".to_string(), limits: videocard::WebGPULimits { max_bind_groups: 4, max_bindings_per_bind_group: 640, max_buffer_size: 2147483648, max_color_attachments_bytes_per_sample: 32, max_color_attachments: 8, max_compute_invocations_per_workgroup: 1024, max_compute_workgroup_size_x: 1024, max_compute_workgroup_size_y: 1024, max_compute_workgroup_size_z: 64, max_compute_workgroup_storage_size: 32768, max_compute_workgroups_per_dimension: 65535, max_dynamic_storage_buffers_per_pipeline_layout: 8, max_dynamic_uniform_buffers_per_pipeline_layout: 10, max_inter_stage_shader_components: 60, max_inter_stage_shader_variables: 16, max_sampled_textures_per_shader_stage: 16, max_samplers_per_shader_stage: 16, max_storage_buffer_binding_size: 2147483647, max_storage_buffers_per_shader_stage: 8, max_storage_textures_per_shader_stage: 8, max_texture_array_layers: 256, max_texture_dimension_1d: 8192, max_texture_dimension_2d: 8192, max_texture_dimension_3d: 2048, max_uniform_buffer_binding_size: 65536, max_uniform_buffers_per_shader_stage: 12, max_vertex_attributes: 16, max_vertex_buffer_array_stride: 2048, max_vertex_buffers: 8, min_storage_buffer_offset_alignment: 256, min_uniform_buffer_offset_alignment: 256 } }), voices: Voices(vec![Voice { language: "en-US".to_string(), name: "Microsoft David - English (United States)".to_string() }, Voice { language: "en-US".to_string(), name: "Microsoft Mark - English (United States)".to_string() }, Voice { language: "en-US".to_string(), name: "Microsoft Zira - English (United States)".to_string() }]), speech_voices: SpeechVoices { enabled: false, voices: Voices(vec![Voice { language: "en-US".to_string(), name: "Microsoft David - English (United States)".to_string() }, Voice { language: "en-US".to_string(), name: "Microsoft Mark - English (United States)".to_string() }, Voice { language: "en-US".to_string(), name: "Microsoft Zira - English (United States)".to_string() }]) }, fonts: Fonts(vec![]), media_devices: MediaDevices { speaker: 0, microphone: 0, webcamera: 0, microphone_name: "".to_string(), webcamera_name: "".to_string() }, ports_protection: PortsProtection { enabled: true, blacklist: vec![3389, 5900, 5800, 7070, 6568, 5938, 63333, 5901, 5902, 5903, 5950, 5931, 5939, 6039, 5944, 6040, 5279, 2112] }, dolphin: DolphinSpecific { profile_id: 502826677, anty_token: "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIyIiwianRpIjoiMGQ4YjYwYjY0MDJhMzY5NjY5Y2IxODhhNTQ0NTIwMWI4NTFlN2I0MTA1NTUwMmQ4NmUyODAxOTFmYzY3MzZmYTAxOTRjNDNkOWE1ZjAwYzgiLCJpYXQiOjE3MzEzNDIzNDEuMTUyMzY0LCJuYmYiOjE3MzEzNDIzNDEuMTUyMzY2LCJleHAiOjE3MzEzNDU5NDEuMTM0NjAxLCJzdWIiOiIxNTQiLCJzY29wZXMiOltdfQ.LMgdZ1fXVTuFeBKu8sg83eLpHqJcY_IwzdS5blOunhkUB2KEcpUHtgdyo6ns3S23noM6r7Rh9GmIag1M-FCLgTfCfXAjGOh7gG6JNVgtOiuMf0Vtd477o6gRKOrCLFrXoc3EsFaQ9YTn6239BIjCw2PbFFCo1dm6wHU94FQ91BIUcIjKOilBwXlxadFyoVOhMfEMRd08nJkrj2ZoFGakBc-6EWNOGZTw_rMAEgNmgyAXt66RCQQhxj7wp-f2qT-RXq9cXff_67rX8iR8LiWB6zVJ8srYtdHOuQrdWcm47v0AxF3MEG1MU1jo6IbnGiXVbyXTI_9Sh6OR1unkJDQxa5kzdKu9qm0jOkNh2Fjhnoox9IQMCZ9KRqV6lgeGQfqskxcQrJR76But8nOqvkyKXX0thOVHOtYebJgrJdsJBfCBU737_q0zqZgKOOnKd2JWJ9HmuSaJBzAXdw6G6uUTTXKxfthywCpFlH54pn36UHcDFyz4KNtLY_0So-RSK9kDanBgF6fnemwYM8JrjxuD6d8m6TFWlJMAIrWAjE6R3Z-wxEckAEv7mtDEMYfcfuPldeAzZ0aboJhoob-1LGe3b-YL9K1SaHNg1GVaWzA_DPm_fSdTJxYlKdjR6iSvrisW9ls7vzBsqeF_Uq6Glr9qgZkx4tX7yOj3S7hVZie_O-8".into(), dolphin_integration_token: "aHR0cHM6Ly9jbG91ZC5kb2xwaGluLnRlY2gvYXBpL3YxOjpleUowZVhBaU9pSktWMVFpTENKaGJHY2lPaUpTVXpJMU5pSjkuZXlKaGRXUWlPaUl4SWl3aWFuUnBJam9pTVRrNU1HSm1ObVV6WkRNNE0yWXdORGswTldJelpUVmxaR1ZpT0RCa09HTmxObUV5WVdGalkyWmlaamxpTnpWak56aGtOamcwWW1ObFpXUTJZbU5pWmpFME1EUXdaRFprT0dOaE4ySTBZekVpTENKcFlYUWlPakUzTWpZd05qSTJNVGt1TmpRNE1qWXNJbTVpWmlJNk1UY3lOakEyTWpZeE9TNDJORGd5TmpJc0ltVjRjQ0k2TVRnNE16Z3lPVEF4T1M0Mk16azROallzSW5OMVlpSTZJamN3TlRGak5EQmpMV00wTm1FdE5EQmlOeTA0T0dJMUxUZzBNell4TWpjNVpUWXpZaUlzSW5OamIzQmxjeUk2VzExOS51bldyZ1hlSE83OUI3bkZzdUFma2FRWDYwT1MxelVwRDVUYmdBSW5wWFVxUmN2YmR6WGlJRVJydDVlU3VuOEpUWW1TNWIwa2RxdWUxSnY3MzVNRkc1Yi1Nb3A2Z1BuSWktUW9KTnpad252U1pJN1ZvMEtaWDhSTzIyVG1JV3p3QzZkaDZ2bkZaQWlmc0d4YWdtUE80ak1Tc2xQaGI1Z3l2NEU0NzRacjJUcnFOVlB1a3FBV3ZlMGFVa0MxUW9OY1lZWDZJVi1wTDN5dldtRHR4b3ltTVZJdGtzSF9WOERjcGFvOEhGVVFjXy1Dd3gtdGhqU0ZfSTFoY1pKZ1k4MXNCVllkWFd0UlhYQk10R0Y3VkdJaDFSUmJtN0VJUWxwck1jWlhzVFFpX2xlV0hfczd0T2NCUkhzU3liaFBPZXNPY0pUX2tBMGR5dW1oMzhxRW5xZzh0QmQ4QXNPMlVwT3RJLUVWc1VMbFdObUhDQ1JxWGNVWC10VkJCUWQxSVBnRjBna0RlOGxocVpfdmZrbHltTmZvOVZrdUlzYjBfY0VVdDVQTGh6UnVBWXA5WGNXelRTUDZpdTFfU2NoQTZnTG1DSC01LUEzZDhLNEFEWU9PLTNHOF9uOTdGZHRtcnVUb1JJMFpLMjNpOVhWRnRQNnJVVm5aVkRkbnAwOGpwdktpY25vRjQ2V2h5UV94bFRDNnVkNEFlTkVGaE9CVGJscnhDWDNudTNvTVBxZXBkdXBqSVBoeDEyMW9Vc2VuM3l2WUs5c0kxY3VVZlhReEpXRDd3Q2tGNmZLcWIxemZjNDdVVGJWN1lTUGtjSXZMVk5BOVZybF9Na3NRbWZkQldrbW1sN0ZXZGhtLVJNTGVUaWkyYmxDVWZUM2lZa1NqNjhZek1MSFZSd3FUdjZsMDo6Y2xvdWQ=".to_string(), base_url: "https://dolphin-anty-api.com".to_string(), api_version: "2022.1.1".to_string(), user_language: "ru".to_string() }, synchronize: Synchronize { session_name: "".to_string(), is_owned: false }, passwords: None };
assert_eq!(
config.json().unwrap(),
r#"{"additional":{"is_chrome_icon":false,"accelerated_2d_canvas":true,"profile_name":"manual geo","rect_noise":1.0,"is_webrtc_enabled":true,"webrtc_ip":"77.246.103.64","is_windows":true,"is_win10":true,"canvas_config_1":5,"canvas_config_2":3,"webgl_config_1":0,"webgl_config_2":0,"is_fake_media":false,"profile_icon":0,"is_canvas_blocked":false,"ostype":0,"canvas_noise_seed":0,"webgl_noise_seed":0,"audio_noise_seed":0,"extensions_new_naming":true,"smart_paste_shift":1.05,"is_real_webrtc":false,"is_webrtc_connection_enabled":false,"is_webrtc_realtime_ip_update_enabled":true,"should_show_profile_name":true},"geolocation":{"install":true,"latitude":52.3759,"longitude":4.8975,"accuracy":10},"screen":{"is_real":true,"width":1440,"height":900,"dpr":1.0,"depth":24},"navigator":{"app_code_name":"Mozilla","app_name":"Netscape","connection":{"downlink":10.2,"effective_type":"4g","rtt":50,"save_data":false},"device_memory":8,"do_not_track":false,"hardware_concurrency":4,"app_locale":"nl","locale":"nl","languages":["nl-BE","nl","en-US","en"],"accept_languages":"nl-BE,nl;q=0.9;en-US,en;q=0.8","platform":"Win32","product":"Gecko","product_sub":"20030107","user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36","vendor":"Google Inc.","vendor_sub":"","timezone":"Europe/Amsterdam"},"hints":{"architecture":"x86","bitness":"64","model":"","platform":"Windows","platform_version":"10.0.0","ua_full_version":"130.0.6723.92","mobile":false,"ua_header":"\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"91\", \"Google Chrome\";v=\"91\"","viewport_width":1440},"webgl":{"unmasked_vendor":"Google Inc. (AMD)","unmasked_renderer":"ANGLE (AMD, AMD FirePro M6100 Direct3D11 vs_5_0 ps_5_0, D3D11)"},"webgpu":{"vendor":"amd","architecture":"gcn-2","device":"","description":"","driver":"","limits":{"max_bind_groups":4,"max_bindings_per_bind_group":640,"max_buffer_size":2147483648,"max_color_attachments_bytes_per_sample":32,"max_color_attachments":8,"max_compute_invocations_per_workgroup":1024,"max_compute_workgroup_size_x":1024,"max_compute_workgroup_size_y":1024,"max_compute_workgroup_size_z":64,"max_compute_workgroup_storage_size":32768,"max_compute_workgroups_per_dimension":65535,"max_dynamic_storage_buffers_per_pipeline_layout":8,"max_dynamic_uniform_buffers_per_pipeline_layout":10,"max_inter_stage_shader_components":60,"max_inter_stage_shader_variables":16,"max_sampled_textures_per_shader_stage":16,"max_samplers_per_shader_stage":16,"max_storage_buffer_binding_size":2147483647,"max_storage_buffers_per_shader_stage":8,"max_storage_textures_per_shader_stage":8,"max_texture_array_layers":256,"max_texture_dimension_1d":8192,"max_texture_dimension_2d":8192,"max_texture_dimension_3d":2048,"max_uniform_buffer_binding_size":65536,"max_uniform_buffers_per_shader_stage":12,"max_vertex_attributes":16,"max_vertex_buffer_array_stride":2048,"max_vertex_buffers":8,"min_storage_buffer_offset_alignment":256,"min_uniform_buffer_offset_alignment":256}},"voices":[{"lang":"en-US","name":"Microsoft David - English (United States)"},{"lang":"en-US","name":"Microsoft Mark - English (United States)"},{"lang":"en-US","name":"Microsoft Zira - English (United States)"}],"speech_voices":{"enabled":false,"voices":[{"lang":"en-US","name":"Microsoft David - English (United States)"},{"lang":"en-US","name":"Microsoft Mark - English (United States)"},{"lang":"en-US","name":"Microsoft Zira - English (United States)"}]},"fonts":[],"media_devices":{"speaker":0,"microphone":0,"webcamera":0,"microphone_name":"","webcamera_name":""},"ports_protection":{"enabled":true,"blacklist":[3389,5900,5800,7070,6568,5938,63333,5901,5902,5903,5950,5931,5939,6039,5944,6040,5279,2112]},"dolphin":{"profile_id":502826677,"anty_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIyIiwianRpIjoiMGQ4YjYwYjY0MDJhMzY5NjY5Y2IxODhhNTQ0NTIwMWI4NTFlN2I0MTA1NTUwMmQ4NmUyODAxOTFmYzY3MzZmYTAxOTRjNDNkOWE1ZjAwYzgiLCJpYXQiOjE3MzEzNDIzNDEuMTUyMzY0LCJuYmYiOjE3MzEzNDIzNDEuMTUyMzY2LCJleHAiOjE3MzEzNDU5NDEuMTM0NjAxLCJzdWIiOiIxNTQiLCJzY29wZXMiOltdfQ.LMgdZ1fXVTuFeBKu8sg83eLpHqJcY_IwzdS5blOunhkUB2KEcpUHtgdyo6ns3S23noM6r7Rh9GmIag1M-FCLgTfCfXAjGOh7gG6JNVgtOiuMf0Vtd477o6gRKOrCLFrXoc3EsFaQ9YTn6239BIjCw2PbFFCo1dm6wHU94FQ91BIUcIjKOilBwXlxadFyoVOhMfEMRd08nJkrj2ZoFGakBc-6EWNOGZTw_rMAEgNmgyAXt66RCQQhxj7wp-f2qT-RXq9cXff_67rX8iR8LiWB6zVJ8srYtdHOuQrdWcm47v0AxF3MEG1MU1jo6IbnGiXVbyXTI_9Sh6OR1unkJDQxa5kzdKu9qm0jOkNh2Fjhnoox9IQMCZ9KRqV6lgeGQfqskxcQrJR76But8nOqvkyKXX0thOVHOtYebJgrJdsJBfCBU737_q0zqZgKOOnKd2JWJ9HmuSaJBzAXdw6G6uUTTXKxfthywCpFlH54pn36UHcDFyz4KNtLY_0So-RSK9kDanBgF6fnemwYM8JrjxuD6d8m6TFWlJMAIrWAjE6R3Z-wxEckAEv7mtDEMYfcfuPldeAzZ0aboJhoob-1LGe3b-YL9K1SaHNg1GVaWzA_DPm_fSdTJxYlKdjR6iSvrisW9ls7vzBsqeF_Uq6Glr9qgZkx4tX7yOj3S7hVZie_O-8","dolphin_integration_token":"aHR0cHM6Ly9jbG91ZC5kb2xwaGluLnRlY2gvYXBpL3YxOjpleUowZVhBaU9pSktWMVFpTENKaGJHY2lPaUpTVXpJMU5pSjkuZXlKaGRXUWlPaUl4SWl3aWFuUnBJam9pTVRrNU1HSm1ObVV6WkRNNE0yWXdORGswTldJelpUVmxaR1ZpT0RCa09HTmxObUV5WVdGalkyWmlaamxpTnpWak56aGtOamcwWW1ObFpXUTJZbU5pWmpFME1EUXdaRFprT0dOaE4ySTBZekVpTENKcFlYUWlPakUzTWpZd05qSTJNVGt1TmpRNE1qWXNJbTVpWmlJNk1UY3lOakEyTWpZeE9TNDJORGd5TmpJc0ltVjRjQ0k2TVRnNE16Z3lPVEF4T1M0Mk16azROallzSW5OMVlpSTZJamN3TlRGak5EQmpMV00wTm1FdE5EQmlOeTA0T0dJMUxUZzBNell4TWpjNVpUWXpZaUlzSW5OamIzQmxjeUk2VzExOS51bldyZ1hlSE83OUI3bkZzdUFma2FRWDYwT1MxelVwRDVUYmdBSW5wWFVxUmN2YmR6WGlJRVJydDVlU3VuOEpUWW1TNWIwa2RxdWUxSnY3MzVNRkc1Yi1Nb3A2Z1BuSWktUW9KTnpad252U1pJN1ZvMEtaWDhSTzIyVG1JV3p3QzZkaDZ2bkZaQWlmc0d4YWdtUE80ak1Tc2xQaGI1Z3l2NEU0NzRacjJUcnFOVlB1a3FBV3ZlMGFVa0MxUW9OY1lZWDZJVi1wTDN5dldtRHR4b3ltTVZJdGtzSF9WOERjcGFvOEhGVVFjXy1Dd3gtdGhqU0ZfSTFoY1pKZ1k4MXNCVllkWFd0UlhYQk10R0Y3VkdJaDFSUmJtN0VJUWxwck1jWlhzVFFpX2xlV0hfczd0T2NCUkhzU3liaFBPZXNPY0pUX2tBMGR5dW1oMzhxRW5xZzh0QmQ4QXNPMlVwT3RJLUVWc1VMbFdObUhDQ1JxWGNVWC10VkJCUWQxSVBnRjBna0RlOGxocVpfdmZrbHltTmZvOVZrdUlzYjBfY0VVdDVQTGh6UnVBWXA5WGNXelRTUDZpdTFfU2NoQTZnTG1DSC01LUEzZDhLNEFEWU9PLTNHOF9uOTdGZHRtcnVUb1JJMFpLMjNpOVhWRnRQNnJVVm5aVkRkbnAwOGpwdktpY25vRjQ2V2h5UV94bFRDNnVkNEFlTkVGaE9CVGJscnhDWDNudTNvTVBxZXBkdXBqSVBoeDEyMW9Vc2VuM3l2WUs5c0kxY3VVZlhReEpXRDd3Q2tGNmZLcWIxemZjNDdVVGJWN1lTUGtjSXZMVk5BOVZybF9Na3NRbWZkQldrbW1sN0ZXZGhtLVJNTGVUaWkyYmxDVWZUM2lZa1NqNjhZek1MSFZSd3FUdjZsMDo6Y2xvdWQ=","base_url":"https://dolphin-anty-api.com","api_version":"2022.1.1","user_language":"ru"},"synhronize":{"name_session":""}"#
);
}
}