|
20394
|
881
|
19
|
2026-05-11T15:22:09.287169+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778512929287_m2.jpg...
|
PhpStorm
|
faVsco.js – ClientTest.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8597075,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"ClientTest","depth":6,"bounds":{"left":0.875,"top":0.019952115,"width":0.04055851,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: ClientTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ClientTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'ClientTest'","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9494681,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.50265956,"top":0.17478053,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"144","depth":4,"bounds":{"left":0.5142952,"top":0.17478053,"width":0.011968086,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":4,"bounds":{"left":0.52825797,"top":0.17478053,"width":0.008976064,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","depth":4,"bounds":{"left":0.124667555,"top":0.16121309,"width":0.42852393,"height":0.8387869},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false}]...
|
-8016712486324069616
|
4446428687123393012
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
20455
|
885
|
10
|
2026-05-11T15:30:44.981176+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778513444981_m2.jpg...
|
PhpStorm
|
faVsco.js – ClientTest.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8597075,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"ClientTest","depth":6,"bounds":{"left":0.875,"top":0.019952115,"width":0.04055851,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: ClientTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ClientTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'ClientTest'","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9494681,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.50265956,"top":0.17478053,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"144","depth":4,"bounds":{"left":0.5142952,"top":0.17478053,"width":0.011968086,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":4,"bounds":{"left":0.52825797,"top":0.17478053,"width":0.008976064,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","depth":4,"bounds":{"left":0.124667555,"top":0.16280925,"width":0.42852393,"height":0.83719075},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.96276593,"top":0.07581804,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9740692,"top":0.074221864,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.98138297,"top":0.074221864,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"bounds":{"left":0.5724734,"top":0.0726257,"width":0.4275266,"height":0.9066241},"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8016712486324069616
|
4446428687123393012
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
20453
|
NULL
|
NULL
|
NULL
|
|
20456
|
884
|
8
|
2026-05-11T15:31:12.391881+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778513472391_m1.jpg...
|
PhpStorm
|
faVsco.js – ClientTest.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"ClientTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"144","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8016712486324069616
|
4446428687123393012
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
20457
|
885
|
11
|
2026-05-11T15:31:15.536866+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778513475536_m2.jpg...
|
PhpStorm
|
faVsco.js – ClientTest.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8597075,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"ClientTest","depth":6,"bounds":{"left":0.875,"top":0.019952115,"width":0.04055851,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: ClientTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ClientTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'ClientTest'","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9494681,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.50265956,"top":0.17478053,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"144","depth":4,"bounds":{"left":0.5142952,"top":0.17478053,"width":0.011968086,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":4,"bounds":{"left":0.52825797,"top":0.17478053,"width":0.008976064,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","depth":4,"bounds":{"left":0.124667555,"top":0.16280925,"width":0.42852393,"height":0.83719075},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.96276593,"top":0.07581804,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9740692,"top":0.074221864,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.98138297,"top":0.074221864,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"bounds":{"left":0.5724734,"top":0.0726257,"width":0.4275266,"height":0.9066241},"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8016712486324069616
|
4446428687123393012
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
20458
|
885
|
12
|
2026-05-11T15:31:54.695819+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778513514695_m2.jpg...
|
PhpStorm
|
faVsco.js – ClientTest.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8597075,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"ClientTest","depth":6,"bounds":{"left":0.875,"top":0.019952115,"width":0.04055851,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: ClientTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ClientTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'ClientTest'","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9494681,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.50265956,"top":0.17478053,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"144","depth":4,"bounds":{"left":0.5142952,"top":0.17478053,"width":0.011968086,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":4,"bounds":{"left":0.52825797,"top":0.17478053,"width":0.008976064,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","depth":4,"bounds":{"left":0.124667555,"top":0.16280925,"width":0.42852393,"height":0.83719075},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.96276593,"top":0.07581804,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9740692,"top":0.074221864,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.98138297,"top":0.074221864,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"bounds":{"left":0.5724734,"top":0.0726257,"width":0.4275266,"height":0.9066241},"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8016712486324069616
|
4446428687123393012
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
20457
|
NULL
|
NULL
|
NULL
|
|
20459
|
884
|
9
|
2026-05-11T15:31:55.390754+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778513515390_m1.jpg...
|
PhpStorm
|
faVsco.js – ClientTest.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"ClientTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"144","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8016712486324069616
|
4446428687123393012
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
20456
|
NULL
|
NULL
|
NULL
|
|
20550
|
NULL
|
0
|
2026-05-11T15:49:30.937355+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778514570937_m2.jpg...
|
PhpStorm
|
faVsco.js – ClientTest.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8597075,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"ClientTest","depth":6,"bounds":{"left":0.875,"top":0.019952115,"width":0.04055851,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: ClientTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ClientTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'ClientTest'","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9494681,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.50265956,"top":0.17478053,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"144","depth":4,"bounds":{"left":0.5142952,"top":0.17478053,"width":0.011968086,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":4,"bounds":{"left":0.52825797,"top":0.17478053,"width":0.008976064,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","depth":4,"bounds":{"left":0.124667555,"top":0.17158818,"width":0.42852393,"height":0.8284118},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.96276593,"top":0.07581804,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9740692,"top":0.074221864,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.98138297,"top":0.074221864,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"bounds":{"left":0.5724734,"top":0.0726257,"width":0.4275266,"height":0.9066241},"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8016712486324069616
|
4446428687123393012
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
20551
|
892
|
0
|
2026-05-11T15:49:56.891002+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778514596891_m1.jpg...
|
PhpStorm
|
faVsco.js – ClientTest.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"ClientTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"144","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8016712486324069616
|
4446428687123393012
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
20549
|
NULL
|
NULL
|
NULL
|
|
20552
|
893
|
0
|
2026-05-11T15:50:01.357221+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778514601357_m2.jpg...
|
PhpStorm
|
faVsco.js – ClientTest.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8597075,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"ClientTest","depth":6,"bounds":{"left":0.875,"top":0.019952115,"width":0.04055851,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: ClientTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ClientTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'ClientTest'","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9494681,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.50265956,"top":0.17478053,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"144","depth":4,"bounds":{"left":0.5142952,"top":0.17478053,"width":0.011968086,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":4,"bounds":{"left":0.52825797,"top":0.17478053,"width":0.008976064,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","depth":4,"bounds":{"left":0.124667555,"top":0.17158818,"width":0.42852393,"height":0.8284118},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.96276593,"top":0.07581804,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9740692,"top":0.074221864,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.98138297,"top":0.074221864,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"bounds":{"left":0.5724734,"top":0.0726257,"width":0.4275266,"height":0.9066241},"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8016712486324069616
|
4446428687123393012
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
20550
|
NULL
|
NULL
|
NULL
|
|
20553
|
892
|
1
|
2026-05-11T15:50:27.273347+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778514627273_m1.jpg...
|
PhpStorm
|
faVsco.js – ClientTest.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"ClientTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"144","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8016712486324069616
|
4446428687123393012
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
20554
|
893
|
1
|
2026-05-11T15:50:31.767082+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778514631767_m2.jpg...
|
PhpStorm
|
faVsco.js – ClientTest.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8597075,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"ClientTest","depth":6,"bounds":{"left":0.875,"top":0.019952115,"width":0.04055851,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: ClientTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ClientTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'ClientTest'","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9494681,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.50265956,"top":0.17478053,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"144","depth":4,"bounds":{"left":0.5142952,"top":0.17478053,"width":0.011968086,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":4,"bounds":{"left":0.52825797,"top":0.17478053,"width":0.008976064,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","depth":4,"bounds":{"left":0.124667555,"top":0.17158818,"width":0.42852393,"height":0.8284118},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.96276593,"top":0.07581804,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9740692,"top":0.074221864,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.98138297,"top":0.074221864,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"bounds":{"left":0.5724734,"top":0.0726257,"width":0.4275266,"height":0.9066241},"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8016712486324069616
|
4446428687123393012
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
20550
|
NULL
|
NULL
|
NULL
|
|
20555
|
892
|
2
|
2026-05-11T15:50:57.645267+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778514657645_m1.jpg...
|
PhpStorm
|
faVsco.js – ClientTest.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"ClientTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'ClientTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"144","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Crm\\Hubspot;\n\nuse GuzzleHttp\\Psr7\\Response;\nuse HubSpot\\Client\\Crm\\Associations\\Api\\BatchApi;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti;\nuse HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Api\\BasicApi as DealsBasicApi;\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Api\\PipelinesApi;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\CollectionResponsePipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Pipeline;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Api\\CoreApi;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery as HubSpotDiscovery;\nuse HubSpot\\Discovery\\Crm\\Deals\\Discovery as DealsDiscovery;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\HubspotTokenManager;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Jiminny\\Services\\SocialAccountService;\nuse League\\OAuth2\\Client\\Token\\AccessToken;\nuse Mockery;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\NullLogger;\nuse SevenShores\\Hubspot\\Endpoints\\Engagements;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Client as HubspotClient;\nuse SevenShores\\Hubspot\\Http\\Response as HubspotResponse;\n\n/**\n * @runTestsInSeparateProcesses\n *\n * @preserveGlobalState disabled\n */\nclass ClientTest extends TestCase\n{\n private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';\n private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';\n private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';\n /**\n * @var Client&MockObject\n */\n private Client $client;\n private Configuration $config;\n\n /**\n * @var SocialAccountService&MockObject\n */\n private SocialAccountService $socialAccountServiceMock;\n\n /**\n * @var HubspotPaginationService&MockObject\n */\n private HubspotPaginationService $paginationServiceMock;\n\n /**\n * @var HubspotTokenManager&MockObject\n */\n private HubspotTokenManager $tokenManagerMock;\n\n /**\n * @var CoreApi&MockObject\n */\n private CoreApi $coreApiMock;\n\n /**\n * @var PipelinesApi&MockObject\n */\n private PipelinesApi $pipelinesApiMock;\n\n /**\n * @var BatchApi&MockObject\n */\n private BatchApi $associationsBatchApiMock;\n\n /**\n * @var DealsBasicApi&MockObject\n */\n private DealsBasicApi $dealsBasicApiMock;\n\n /**\n * @var Engagements&MockObject\n */\n private $engagementsMock;\n\n /**\n * @var HubspotClient&MockObject\n */\n private HubspotClient $hubspotClientMock;\n\n protected function setUp(): void\n {\n // Create mocks for dependencies\n $this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);\n $this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);\n $this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);\n\n // Create a real Client instance with mocked dependencies\n // Create a partial mock only for the methods we need to mock\n $client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);\n $client->setLogger(new NullLogger());\n\n // Inject the real dependencies using reflection\n $reflection = new \\ReflectionClass(Client::class);\n\n $accountServiceProperty = $reflection->getProperty('accountService');\n $accountServiceProperty->setAccessible(true);\n $accountServiceProperty->setValue($client, $this->socialAccountServiceMock);\n\n $paginationServiceProperty = $reflection->getProperty('paginationService');\n $paginationServiceProperty->setAccessible(true);\n $paginationServiceProperty->setValue($client, $this->paginationServiceMock);\n\n $tokenManagerProperty = $reflection->getProperty('tokenManager');\n $tokenManagerProperty->setAccessible(true);\n $tokenManagerProperty->setValue($client, $this->tokenManagerMock);\n $factoryMock = $this->createMock(Factory::class);\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $engagementsMock = $this->createMock(\\SevenShores\\Hubspot\\Endpoints\\Engagements::class);\n\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n $factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);\n\n $client->method('getInstance')->willReturn($factoryMock);\n\n $discoveryMock = $this->createMock(HubSpotDiscovery\\Discovery::class);\n $crmMock = $this->createMock(HubSpotDiscovery\\Crm\\Discovery::class);\n $associationsMock = $this->createMock(HubSpotDiscovery\\Crm\\Associations\\Discovery::class);\n $propertiesMock = $this->createMock(HubSpotDiscovery\\Crm\\Properties\\Discovery::class);\n $pipelinesMock = $this->createMock(HubSpotDiscovery\\Crm\\Pipelines\\Discovery::class);\n $coreApiMock = $this->createMock(CoreApi::class);\n $pipelinesApiMock = $this->createMock(PipelinesApi::class);\n $associationsBatchApiMock = $this->createMock(BatchApi::class);\n $dealsBasicApiMock = $this->createMock(DealsBasicApi::class);\n\n $propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);\n $pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);\n $associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);\n $dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);\n $dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);\n\n $returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];\n $crmMock->method('__call')\n ->willReturnCallback(static fn (string $name) => $returnMap[$name])\n ;\n\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n\n $this->client = $client;\n $this->config = $this->createMock(Configuration::class);\n $this->client->setConfiguration($this->config);\n $this->coreApiMock = $coreApiMock;\n $this->pipelinesApiMock = $pipelinesApiMock;\n $this->associationsBatchApiMock = $associationsBatchApiMock;\n $this->dealsBasicApiMock = $dealsBasicApiMock;\n $this->engagementsMock = $engagementsMock;\n $this->hubspotClientMock = $hubspotClientMock;\n }\n\n public function testGetMinimumApiVersion(): void\n {\n $this->assertIsString($this->client->getMinimumApiVersion());\n }\n\n public function testGetInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setBaseUrl('https://example.com');\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n $factory = $client->getInstance();\n\n $this->assertEquals('foo', $factory->getClient()->key);\n }\n\n public function testGetNewInstance(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $client = new Client($socialAccountService, $paginationService, $tokenManager);\n $client->setAccessToken(new AccessToken(['access_token' => 'foo']));\n\n $factory = $client->getNewInstance();\n $token = $factory->auth()->oAuth()->accessTokensApi()->getConfig()->getAccessToken();\n $this->assertEquals('foo', $token);\n }\n\n public function testFetchProperty(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n 'some_property',\n $this->client->fetchProperty('foo', 'test')['name']\n );\n }\n\n public function testFetchPropertyOptions(): void\n {\n $this->coreApiMock->method('getByName')->willReturn($this->generateProperty());\n\n $this->assertEquals(\n [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n $this->client->fetchPropertyOptions('foo', 'test')\n );\n }\n\n public function testFetchCallDispositions(): void\n {\n $this->engagementsMock\n ->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse([\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ]))\n ;\n\n $this->assertEquals(\n [\n [\n 'id' => 1,\n 'label' => 'foo',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'bar',\n 'deleted' => false,\n ],\n ],\n $this->client->fetchCallDispositions()\n );\n }\n\n public function testFetchDispositionFieldOptions(): void\n {\n $this->engagementsMock->method('getCallDispositions')\n ->willReturn($this->generateHubSpotResponse(\n [\n [\n 'id' => 1,\n 'label' => 'Label 1',\n 'deleted' => false,\n ],\n [\n 'id' => 2,\n 'label' => 'Label 2',\n 'deleted' => true,\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n [\n 'value' => 1,\n 'id' => 1,\n 'label' => 'Label 1',\n ],\n ],\n $this->client->fetchDispositionFieldOptions()\n );\n }\n\n public function testFetchOpportunityPipelineStages(): void\n {\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n $this->client->fetchOpportunityPipelineStages()\n );\n }\n\n public function testFetchOpportunityPipelineStagesErrorResponse(): void\n {\n $this->pipelinesApiMock\n ->method('getAll')\n ->with('deals')\n ->willReturn(new Error(['message' => 'test error']))\n ;\n\n $this->assertEmpty($this->client->fetchOpportunityPipelineStages());\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('meetingOutcomeFieldProvider')]\n public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void\n {\n $field = new Field(['crm_provider_id' => $fieldId]);\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('GET', $expectedEndpoint)\n ->willReturn($this->generateHubSpotResponse(\n [\n 'options' => [\n ['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]\n ))\n ;\n\n $this->assertEquals(\n [\n ['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],\n ['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],\n ['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],\n ],\n $this->client->fetchMeetingOutcomeFieldOptions($field)\n );\n }\n\n public static function meetingOutcomeFieldProvider(): array\n {\n return [\n 'meeting outcome field' => [\n 'meetingOutcome',\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome',\n ],\n 'activity type field' => [\n 'foobar',\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type',\n ],\n ];\n }\n\n #[\\PHPUnit\\Framework\\Attributes\\DataProvider('opportunityFieldOptionsProvider')]\n public function testFetchOpportunityFieldOptions(Field $field, string $type): void\n {\n $responses = [\n self::RESPONSE_TYPE_STAGE_FIELD => [\n ['id' => 'foo', 'label' => 'bar'],\n ['id' => 'baz', 'label' => 'qux'],\n ],\n self::RESPONSE_TYPE_PIPELINE_FIELD => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n self::RESPONSE_TYPE_REGULAR_FIELD => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ];\n\n $field = $this->createMock(Field::class);\n\n if ($type === self::RESPONSE_TYPE_REGULAR_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(false);\n $propertyResponse = $this->generateProperty();\n $this->coreApiMock->method('getByName')->willReturn($propertyResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_STAGE_FIELD) {\n $field->method('isStageField')->willReturn(true);\n /**\n * @TODO: The class CollectionResponsePipeline will be deprecated in the next Hubspot version\n */\n\n $pipelineStagesResponse = new CollectionResponsePipeline([\n 'results' => [$this->generatePipeline()],\n ]);\n $this->pipelinesApiMock\n ->method('getAll')\n ->willReturn($pipelineStagesResponse);\n }\n\n if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {\n $field->method('isStageField')->willReturn(false);\n $field->method('isPipelineField')->willReturn(true);\n $pipelineResponse = $this->generateHubSpotResponse([\n 'results' => [\n ['id' => '123', 'label' => 'Sales'],\n ['id' => 'default', 'label' => 'CS'],\n ],\n ]);\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($pipelineResponse);\n }\n\n $this->assertEquals(\n $responses[$type],\n $this->client->fetchOpportunityFieldOptions($field)\n );\n }\n\n public static function opportunityFieldOptionsProvider(): array\n {\n return [\n 'stage field' => [\n 'field' => new Field(['crm_provider_id' => 'dealstage']),\n 'type' => self::RESPONSE_TYPE_STAGE_FIELD,\n ],\n 'pipeline field' => [\n 'field' => new Field(['crm_provider_id' => 'pipeline']),\n 'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,\n ],\n 'regular field' => [\n 'field' => new Field(['crm_provider_id' => 'some_property']),\n 'type' => self::RESPONSE_TYPE_REGULAR_FIELD,\n ],\n ];\n }\n\n private function generateHubSpotResponse(array $data): HubspotResponse\n {\n return new HubspotResponse(new Response(200, [], json_encode($data)));\n }\n\n private function generateProperty(): Property\n {\n return new Property([\n 'name' => 'some_property',\n 'options' => [\n [\n 'label' => 'label_1',\n 'value' => 'value_1',\n ],\n [\n 'label' => 'label_2',\n 'value' => 'value_2',\n ],\n ],\n ]);\n }\n\n private function generatePipeline(): Pipeline\n {\n return new Pipeline(['stages' => [\n new PipelineStage(['id' => 'foo', 'label' => 'bar']),\n new PipelineStage(['id' => 'baz', 'label' => 'qux']),\n ]]);\n }\n\n public function testFetchOpportunityPipelines(): void\n {\n $this->client\n ->method('makeRequest')\n ->with('/crm/v3/pipelines/deals')\n ->willReturn($this->generateHubSpotResponse([\n 'results' => [\n ['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],\n ['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],\n ['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],\n ],\n ]));\n\n $this->assertEquals(\n [\n ['id' => 'id_1', 'label' => 'Option 1'],\n ['id' => 'id_2', 'label' => 'Option 2'],\n ['id' => 'id_3', 'label' => 'Option 3'],\n ],\n $this->client->fetchOpportunityPipelines()\n );\n }\n\n public function testGetPaginatedData(): void\n {\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ['id' => 'id_3', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator and modify reference parameters\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n ['payload_key' => 'payload_value'],\n 'foobar',\n 0,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {\n $total = 3;\n $lastRecordId = 'id_3';\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n $this->assertEquals(\n [\n 'results' => $expectedResults,\n 'total' => 3,\n 'last_record' => 'id_3',\n ],\n $this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')\n );\n }\n\n public function testGetAssociationsData(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $responseResults = [];\n foreach ($ids as $id) {\n $from = new PublicObjectId();\n $from->setId($id);\n\n $to1 = new PublicObjectId();\n $to1->setId('contact_' . $id . '_1');\n $to2 = new PublicObjectId();\n $to2->setId('contact_' . $id . '_2');\n\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to1, $to2]);\n\n $responseResults[] = $result;\n }\n\n $batchResponse = new BatchResponsePublicAssociationMulti();\n $batchResponse->setResults($responseResults);\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {\n $inputIds = array_map(\n fn ($input) => $input->getId(),\n $batchInput->getInputs()\n );\n\n return $inputIds === $ids;\n })\n )\n ->willReturn($batchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $expectedResult = [\n '1' => ['contact_1_1', 'contact_1_2'],\n '2' => ['contact_2_1', 'contact_2_2'],\n '3' => ['contact_3_1', 'contact_3_2'],\n ];\n\n $this->assertEquals($expectedResult, $result);\n }\n\n public function testGetAssociationsDataHandlesException(): void\n {\n $ids = ['1', '2', '3'];\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $exception = new \\Exception('API Error');\n\n $this->associationsBatchApiMock->expects($this->once())\n ->method('read')\n ->with(\n $this->equalTo($fromObject),\n $this->equalTo($toObject),\n $this->callback(function ($batchInput) use ($ids) {\n return $batchInput instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId\n && count($batchInput->getInputs()) === count($ids);\n })\n )\n ->willThrowException($exception);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[Hubspot] Failed to fetch associations',\n [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => 'API Error',\n ]\n );\n\n $this->client->setLogger($loggerMock);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertEmpty($result);\n $this->assertIsArray($result);\n }\n\n public function testGetAssociationsDataWithLargeDataSet(): void\n {\n $ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items\n $fromObject = 'deals';\n $toObject = 'contacts';\n\n $firstBatchResponse = new BatchResponsePublicAssociationMulti();\n $firstBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $firstBatchResponse->setResults($firstBatchResults);\n\n $secondBatchResponse = new BatchResponsePublicAssociationMulti();\n $secondBatchResults = array_map(function ($id) {\n $from = new PublicObjectId();\n $from->setId($id);\n $to = new PublicObjectId();\n $to->setId('contact_' . $id);\n $result = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicAssociationMulti();\n $result->setFrom($from);\n $result->setTo([$to]);\n\n return $result;\n }, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));\n $secondBatchResponse->setResults($secondBatchResults);\n\n $this->associationsBatchApiMock->expects($this->exactly(3))\n ->method('read')\n ->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);\n\n $result = $this->client->getAssociationsData($ids, $fromObject, $toObject);\n\n $this->assertCount(2500, $result);\n $this->assertArrayHasKey('1', $result);\n $this->assertArrayHasKey('2500', $result);\n $this->assertEquals(['contact_1'], $result['1']);\n $this->assertEquals(['contact_2500'], $result['2500']);\n }\n\n public function testGetContactByEmailSuccess(): void\n {\n $email = 'test@example.com';\n $fields = ['firstname', 'lastname', 'email'];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn([\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ]);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname,email', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n 'email' => 'test@example.com',\n ],\n ], $result);\n }\n\n public function testGetContactByEmailWithEmptyFields(): void\n {\n $email = 'test@example.com';\n $fields = [];\n\n $contactMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $contactMock->method('getId')->willReturn('12345');\n $contactMock->method('getProperties')->willReturn(['email' => 'test@example.com']);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, '', null, false, 'email')\n ->willReturn($contactMock);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new NullLogger());\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([\n 'id' => '12345',\n 'properties' => ['email' => 'test@example.com'],\n ], $result);\n }\n\n public function testGetContactByEmailApiException(): void\n {\n $email = 'nonexistent@example.com';\n $fields = ['firstname', 'lastname'];\n\n $exception = new \\HubSpot\\Client\\Crm\\Contacts\\ApiException('Contact not found', 404);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($email, 'firstname,lastname', null, false, 'email')\n ->willThrowException($exception);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('info')\n ->with(\n '[Hubspot] Failed to fetch contact',\n [\n 'email' => $email,\n 'reason' => 'Contact not found',\n ]\n );\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger($loggerMock);\n\n $result = $client->getContactByEmail($email, $fields);\n\n $this->assertEquals([], $result);\n }\n\n public function testGetOpportunityById(): void\n {\n $opportunityId = '12345';\n $expectedProperties = [\n 'dealname' => 'Test Opportunity',\n 'amount' => '1000.00',\n 'closedate' => '2024-12-31T23:59:59.999Z',\n 'dealstage' => 'presentationscheduled',\n 'pipeline' => 'default',\n ];\n\n $mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);\n $mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);\n $mockHubspotOpportunity->method('getId')->willReturn($opportunityId);\n $now = new \\DateTimeImmutable();\n $mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);\n $mockHubspotOpportunity->method('getArchived')->willReturn(false);\n\n $this->dealsBasicApiMock\n ->expects($this->once())\n ->method('getById')\n ->willReturn($mockHubspotOpportunity);\n\n // Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.\n // The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]\n // Adjust assertions below based on the actual return structure of your method.\n $result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertEquals($opportunityId, $result['id']);\n }\n\n public function testGetContactById(): void\n {\n $crmId = 'contact-123';\n $fields = ['firstname', 'lastname'];\n $expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];\n\n $mockContact = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations::class);\n $mockContact->method('getId')->willReturn($crmId);\n $mockContact->method('getProperties')->willReturn((object) $expectedProperties);\n\n $contactsApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Contacts\\Api\\BasicApi::class);\n $contactsApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'firstname,lastname')\n ->willReturn($mockContact);\n\n $contactsDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Contacts\\Discovery::class);\n $contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {\n if ($name === 'contacts') {\n return $contactsDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getContactById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testGetAccountById(): void\n {\n $crmId = 'account-123';\n $fields = ['name', 'industry'];\n $expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];\n\n $mockCompany = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations::class);\n $mockCompany->method('getId')->willReturn($crmId);\n $mockCompany->method('getProperties')->willReturn((object) $expectedProperties);\n\n $companiesApiMock = $this->createMock(\\HubSpot\\Client\\Crm\\Companies\\Api\\BasicApi::class);\n $companiesApiMock->expects($this->once())\n ->method('getById')\n ->with($crmId, 'name,industry')\n ->willReturn($mockCompany);\n\n $companiesDiscoveryMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Companies\\Discovery::class);\n $companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);\n\n $crmMock = $this->createMock(\\HubSpot\\Discovery\\Crm\\Discovery::class);\n $crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {\n if ($name === 'companies') {\n return $companiesDiscoveryMock;\n }\n\n return $this->createMock(\\HubSpot\\Discovery\\Crm\\Properties\\Discovery::class);\n });\n\n $discoveryMock = $this->createMock(\\HubSpot\\Discovery\\Discovery::class);\n $discoveryMock->method('__call')->with('crm')->willReturn($crmMock);\n\n $client = $this->createPartialMock(Client::class, ['getNewInstance']);\n $client->method('getNewInstance')->willReturn($discoveryMock);\n $client->setLogger(new \\Psr\\Log\\NullLogger());\n\n $result = $client->getAccountById($crmId, $fields);\n\n $this->assertIsArray($result);\n $this->assertArrayHasKey('id', $result);\n $this->assertArrayHasKey('properties', $result);\n $this->assertEquals($crmId, $result['id']);\n $this->assertEquals((object) $expectedProperties, $result['properties']);\n }\n\n public function testEnsureValidTokenWithNoTokenUpdate(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n $originalToken = 'original_token';\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $accessTokenProperty->setValue($this->client, $originalToken);\n\n // Mock token manager to return null (no refresh needed)\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn(null);\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was not changed\n $this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));\n }\n\n\n\n\n\n\n public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void\n {\n $payload = ['filters' => []];\n $type = 'contacts';\n $offset = 0;\n $total = 0;\n $lastRecordId = null;\n\n $expectedResults = [\n ['id' => 'id_1', 'properties' => []],\n ['id' => 'id_2', 'properties' => []],\n ];\n\n // Mock the pagination service to return a generator\n $this->paginationServiceMock\n ->expects($this->once())\n ->method('getPaginatedDataGenerator')\n ->with(\n $this->client,\n $payload,\n $type,\n $offset,\n $this->anything(),\n $this->anything()\n )\n ->willReturnCallback(function () use ($expectedResults) {\n foreach ($expectedResults as $result) {\n yield $result;\n }\n });\n\n // Execute the pagination\n $results = [];\n foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {\n $results[] = $result;\n }\n\n $this->assertCount(2, $results);\n $this->assertEquals('id_1', $results[0]['id']);\n $this->assertEquals('id_2', $results[1]['id']);\n }\n\n public function testEnsureValidTokenDelegatesToTokenManager(): void\n {\n $socialAccountMock = $this->createMock(SocialAccount::class);\n\n // Set up OAuth account\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, $socialAccountMock);\n\n // Mock token manager to return new token\n $this->tokenManagerMock\n ->expects($this->once())\n ->method('ensureValidToken')\n ->with($socialAccountMock)\n ->willReturn('new_access_token');\n\n // Call ensureValidToken\n $this->client->ensureValidToken();\n\n // Verify access token was updated\n $accessTokenProperty = $reflection->getProperty('accessToken');\n $accessTokenProperty->setAccessible(true);\n $this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));\n }\n\n public function testGetOwnersArchivedWithValidResponse(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'owner1@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => true,\n ],\n ],\n ];\n\n // Create a mock response object\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n // Set up the client to return our test data\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=true'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(true);\n\n // Assert the results\n $this->assertCount(1, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('owner1@example.com', $result[0]->getEmail());\n $this->assertEquals('John Doe', $result[0]->getFullName());\n $this->assertTrue($result[0]->isArchived());\n }\n\n public function testGetOwnersArchivedWithEmptyResponse(): void\n {\n // Create a mock response object with empty results\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn(['results' => []]);\n\n // Set up the client to return empty results\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n // Call the method\n $result = $this->client->getOwnersArchived(false);\n\n // Assert the results\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithInvalidResponse(): void\n {\n // Create a mock response that will throw an exception when toArray is called\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willThrowException(new \\InvalidArgumentException('Invalid JSON'));\n\n // Set up the client to return the problematic response\n $this->client->method('makeRequest')\n ->willReturn($response);\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(true);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithHttpError(): void\n {\n // Set up the client to throw an exception\n $this->client->method('makeRequest')\n ->willThrowException(new \\Exception('HTTP Error'));\n\n // Mock the logger to expect an error message\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Failed to fetch owners'));\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n // Call the method and expect an empty array on error\n $result = $this->client->getOwnersArchived(false);\n $this->assertIsArray($result);\n $this->assertEmpty($result);\n }\n\n public function testGetOwnersArchivedWithOwnerCreationException(): void\n {\n $responseData = [\n 'results' => [\n [\n 'id' => '123',\n 'email' => 'valid@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'John',\n 'lastName' => 'Doe',\n 'userId' => 456,\n 'userIdIncludingInactive' => 789,\n 'createdAt' => '2023-01-01T12:00:00Z',\n 'updatedAt' => '2023-01-02T12:00:00Z',\n 'archived' => false,\n ],\n [\n 'id' => '456',\n 'email' => 'invalid@example.com',\n 'type' => 'PERSON',\n 'createdAt' => 'invalid-date-format',\n ],\n [\n 'id' => '789',\n 'email' => 'another@example.com',\n 'type' => 'PERSON',\n 'firstName' => 'Jane',\n 'lastName' => 'Smith',\n 'userId' => 999,\n 'userIdIncludingInactive' => 888,\n 'createdAt' => '2023-01-03T12:00:00Z',\n 'updatedAt' => '2023-01-04T12:00:00Z',\n 'archived' => false,\n ],\n ],\n ];\n\n $response = $this->createMock(\\SevenShores\\Hubspot\\Http\\Response::class);\n $response->method('toArray')\n ->willReturn($responseData);\n\n $this->client->method('makeRequest')\n ->with(\n '/crm/v3/owners',\n 'GET',\n [],\n 'archived=false'\n )\n ->willReturn($response);\n\n $loggerMock = $this->createMock(\\Psr\\Log\\LoggerInterface::class);\n $loggerMock->expects($this->once())\n ->method('error')\n ->with(\n '[HubSpot] Failed to process owner data',\n $this->callback(function ($context) {\n return isset($context['result']) &&\n isset($context['error']) &&\n $context['result']['id'] === '456' &&\n $context['result']['email'] === 'invalid@example.com' &&\n str_contains($context['error'], 'invalid-date-format');\n })\n );\n\n $reflection = new \\ReflectionClass($this->client);\n $loggerProperty = $reflection->getProperty('log');\n $loggerProperty->setAccessible(true);\n $loggerProperty->setValue($this->client, $loggerMock);\n\n $result = $this->client->getOwnersArchived(false);\n\n $this->assertIsArray($result);\n $this->assertCount(2, $result);\n $this->assertEquals('123', $result[0]->getId());\n $this->assertEquals('valid@example.com', $result[0]->getEmail());\n $this->assertEquals('789', $result[1]->getId());\n $this->assertEquals('another@example.com', $result[1]->getEmail());\n }\n\n public function testMakeRequestWithGetMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n null,\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithGetMethodAndQueryString(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'GET',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n [],\n 'limit=10&offset=0',\n true\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'GET', [], 'limit=10&offset=0');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPostMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'John',\n 'lastname' => 'Doe',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPutMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'firstname' => 'Jane',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'updated' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PUT',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PUT', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithPatchMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $payload = [\n 'properties' => [\n 'email' => 'newemail@example.com',\n ],\n ];\n\n $psrResponse = new Response(200, [], json_encode(['id' => '12345', 'patched' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'PATCH',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => $payload]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'PATCH', $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithDeleteMethod(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['deleted' => true]));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'DELETE',\n 'https://api.hubapi.com/crm/v3/objects/contacts/12345',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts/12345', 'DELETE');\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestWithEmptyPayload(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'ok']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n 'POST',\n 'https://api.hubapi.com/crm/v3/objects/contacts',\n ['json' => []]\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $result = $client->makeRequest('/crm/v3/objects/contacts', 'POST', []);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testMakeRequestPrependsBaseUrl(): void\n {\n $socialAccountService = $this->createMock(SocialAccountService::class);\n $paginationService = $this->createMock(HubspotPaginationService::class);\n $tokenManager = $this->createMock(HubspotTokenManager::class);\n\n $psrResponse = new Response(200, [], json_encode(['status' => 'success']));\n $expectedResponse = new HubspotResponse($psrResponse);\n\n $hubspotClientMock = $this->createMock(HubspotClient::class);\n $hubspotClientMock->expects($this->once())\n ->method('request')\n ->with(\n $this->anything(),\n 'https://api.hubapi.com/test/endpoint',\n $this->anything()\n )\n ->willReturn($expectedResponse);\n\n $factoryMock = $this->createMock(Factory::class);\n $factoryMock->method('getClient')->willReturn($hubspotClientMock);\n\n $client = $this->getMockBuilder(Client::class)\n ->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])\n ->onlyMethods(['getInstance'])\n ->getMock();\n\n $client->method('getInstance')->willReturn($factoryMock);\n $client->setAccessToken(new AccessToken(['access_token' => 'test_token']));\n\n $client->makeRequest('/test/endpoint', 'GET');\n }\n\n public function testGetOpportunitiesByIds(): void\n {\n $crmIds = ['deal1', 'deal2', 'deal3'];\n $fields = ['dealname', 'amount'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getOpportunitiesByIds'));\n }\n\n public function testGetCompaniesByIds(): void\n {\n $crmIds = ['company1', 'company2'];\n $fields = ['name', 'industry'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getCompaniesByIds'));\n }\n\n public function testGetContactsByIds(): void\n {\n $crmIds = ['contact1', 'contact2'];\n $fields = ['firstname', 'lastname'];\n\n // Test basic functionality - method exists and returns array\n $this->assertTrue(method_exists($this->client, 'getContactsByIds'));\n }\n\n public function testBatchReadObjectsEmptyIds(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $result = $method->invokeArgs($this->client, ['deals', [], ['dealname']]);\n\n $this->assertEquals([], $result);\n }\n\n public function testBatchReadObjectsExceedsBatchSize(): void\n {\n $crmIds = array_fill(0, 101, 'deal_id'); // 101 IDs, exceeds limit of 100\n\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\InvalidArgumentException::class);\n $this->expectExceptionMessage('Batch size cannot exceed 100 deals');\n\n $method->invokeArgs($this->client, ['deals', $crmIds, ['dealname']]);\n }\n\n public function testBatchReadObjectsUnsupportedObjectType(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $method = $reflection->getMethod('batchReadObjects');\n $method->setAccessible(true);\n\n $this->expectException(\\Jiminny\\Exceptions\\CrmException::class);\n $this->expectExceptionMessage('Failed to batch fetch unsupported');\n\n $method->invokeArgs($this->client, ['unsupported', ['id1'], ['field1']]);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequest401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Unauthorized', 401);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithBadRequestNon401(): void\n {\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\BadRequest('Bad Request', 400);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleRequestException(): void\n {\n $response = new Response(401, [], 'Unauthorized');\n $exception = new \\GuzzleHttp\\Exception\\RequestException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), $response);\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithGuzzleClientException(): void\n {\n $exception = new \\GuzzleHttp\\Exception\\ClientException('Unauthorized', new \\GuzzleHttp\\Psr7\\Request('GET', 'test'), new Response(401));\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithStringMatching(): void\n {\n $exception = new \\Exception('HTTP 401 Unauthorized error occurred');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertTrue($result);\n }\n\n public function testIsUnauthorizedExceptionWithNonUnauthorized(): void\n {\n $exception = new \\Exception('Some other error');\n\n $result = $this->client->isUnauthorizedException($exception);\n\n $this->assertFalse($result);\n }\n\n public function testEnsureValidTokenWithNullOauthAccount(): void\n {\n $reflection = new \\ReflectionClass($this->client);\n $oauthAccountProperty = $reflection->getProperty('oauthAccount');\n $oauthAccountProperty->setAccessible(true);\n $oauthAccountProperty->setValue($this->client, null);\n\n // Should not throw exception and not call token manager\n $this->tokenManagerMock->expects($this->never())->method('ensureValidToken');\n\n $this->client->ensureValidToken();\n\n $this->assertTrue(true); // Test passes if no exception is thrown\n }\n\n public function testGetConfig(): void\n {\n $result = $this->client->getConfig();\n\n $this->assertSame($this->config, $result);\n }\n\n public function testGetOwners(): void\n {\n // Test that the method exists and can be called\n $this->assertTrue(method_exists($this->client, 'getOwners'));\n\n // Since getOwners has complex HubSpot API dependencies,\n // we'll just verify the method exists for now\n $this->assertIsCallable([$this->client, 'getOwners']);\n }\n\n public function testCreateMeeting(): void\n {\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Test Meeting',\n 'hs_meeting_start_time' => '2024-01-01T10:00:00Z',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => 'meeting123']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with('/crm/v3/objects/meetings', 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->createMeeting($payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testUpdateMeeting(): void\n {\n $meetingId = 'meeting123';\n $payload = [\n 'properties' => [\n 'hs_meeting_title' => 'Updated Meeting',\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['id' => $meetingId, 'updated' => true]);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v3/objects/meetings/{$meetingId}\", 'PATCH', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->updateMeeting($meetingId, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testAddAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/create\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->addAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n public function testRemoveAssociations(): void\n {\n $objectType = 'deals';\n $associationType = 'contacts';\n $payload = [\n 'inputs' => [\n ['from' => ['id' => 'deal1'], 'to' => ['id' => 'contact1']],\n ],\n ];\n\n $expectedResponse = $this->generateHubSpotResponse(['status' => 'success']);\n\n $this->client->expects($this->once())\n ->method('makeRequest')\n ->with(\"/crm/v4/associations/{$objectType}/{$associationType}/batch/archive\", 'POST', $payload)\n ->willReturn($expectedResponse);\n\n $result = $this->client->removeAssociations($objectType, $associationType, $payload);\n\n $this->assertSame($expectedResponse, $result);\n }\n\n // -------------------------------------------------------------------------\n // search() / executeRequest() tests\n // -------------------------------------------------------------------------\n\n public function testSearchReturnsDecodedArrayOnSuccess(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $payload = ['filters' => []];\n $responseData = ['results' => [['id' => '1']], 'total' => 1, 'paging' => []];\n $hubspotResponse = new HubspotResponse(new Response(200, [], json_encode($responseData)));\n\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->with('POST', Client::BASE_URL . '/crm/v3/objects/contacts/search', ['json' => $payload])\n ->willReturn($hubspotResponse);\n\n $result = $this->client->search('contacts', $payload);\n\n $this->assertSame($responseData, $result);\n\n Mockery::close();\n }\n\n public function testSearchThrowsRateLimitExceptionWhenCircuitBreakerActive(): void\n {\n $futureTimestamp = (string) (time() + 30);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(42);\n\n $this->hubspotClientMock->expects($this->never())->method('request');\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot rate limit (cached circuit-breaker)');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchThrowsRateLimitExceptionAndSetsNxOnFresh429(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n // NX + TTL option array — exact TTL depends on parseRetryAfter, verified separately\n $redisMock->shouldReceive('set')\n ->once()\n ->with(\n 'hubspot:ratelimit:config:42',\n Mockery::type('string'),\n Mockery::on(fn ($opts) => is_array($opts) && in_array('nx', $opts, true))\n );\n\n $this->config->method('getId')->willReturn(42);\n\n $badRequest = new BadRequest('Rate limit exceeded', 429);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($badRequest);\n\n $this->expectException(RateLimitException::class);\n $this->expectExceptionMessage('Hubspot returned 429');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchPropagatesNonRateLimitException(): void\n {\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn(null);\n\n $this->config->method('getId')->willReturn(42);\n\n $exception = new \\SevenShores\\Hubspot\\Exceptions\\HubspotException('Server error', 500);\n $this->hubspotClientMock\n ->expects($this->once())\n ->method('request')\n ->willThrowException($exception);\n\n $this->expectException(\\SevenShores\\Hubspot\\Exceptions\\HubspotException::class);\n $this->expectExceptionMessage('Server error');\n\n try {\n $this->client->search('contacts', []);\n } finally {\n Mockery::close();\n }\n }\n\n public function testSearchCircuitBreakerRetryAfterComputedFromStoredTimestamp(): void\n {\n $remaining = 45;\n $futureTimestamp = (string) (time() + $remaining);\n\n $redisMock = Mockery::mock('alias:Illuminate\\Support\\Facades\\Redis');\n $redisMock->shouldReceive('get')->once()->andReturn($futureTimestamp);\n\n $this->config->method('getId')->willReturn(1);\n\n try {\n $this->client->search('deals', []);\n $this->fail('Expected RateLimitException');\n } catch (RateLimitException $e) {\n $this->assertGreaterThanOrEqual(1, $e->getRetryAfter());\n $this->assertLessThanOrEqual($remaining, $e->getRetryAfter());\n } finally {\n Mockery::close();\n }\n }\n\n // -------------------------------------------------------------------------\n // isHubspotRateLimit() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callIsHubspotRateLimit(\\Throwable $e): bool\n {\n $method = new \\ReflectionMethod($this->client, 'isHubspotRateLimit');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testIsHubspotRateLimitReturnsTrueForBadRequest429(): void\n {\n $e = new BadRequest('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForDealApiException429(): void\n {\n $e = new DealApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForContactApiException429(): void\n {\n $e = new ContactApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForCompanyApiException429(): void\n {\n $e = new CompanyApiException('Too Many Requests', 429);\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsTrueForGuzzleRequestException429(): void\n {\n $request = new \\GuzzleHttp\\Psr7\\Request('POST', 'https://api.hubapi.com/test');\n $response = new \\GuzzleHttp\\Psr7\\Response(429);\n $e = new \\GuzzleHttp\\Exception\\RequestException('Too Many Requests', $request, $response);\n\n $this->assertTrue($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForBadRequestNon429(): void\n {\n $e = new BadRequest('Bad Request', 400);\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n public function testIsHubspotRateLimitReturnsFalseForGenericException(): void\n {\n $e = new \\RuntimeException('Something went wrong');\n $this->assertFalse($this->callIsHubspotRateLimit($e));\n }\n\n // -------------------------------------------------------------------------\n // parseRetryAfter() tests (private method — tested via reflection)\n // -------------------------------------------------------------------------\n\n private function callParseRetryAfter(\\Throwable $e): int\n {\n $method = new \\ReflectionMethod($this->client, 'parseRetryAfter');\n $method->setAccessible(true);\n\n return $method->invoke($this->client, $e);\n }\n\n public function testParseRetryAfterReadsRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['30']]);\n $this->assertSame(30, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReadsLowercaseRetryAfterHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['retry-after' => ['15']]);\n $this->assertSame(15, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterHandlesScalarHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => '60']);\n $this->assertSame(60, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDailyLimitDelay(): void\n {\n $e = new BadRequest('Daily rate limit exceeded');\n $this->assertSame(600, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsTenSecondlyDelay(): void\n {\n $e = new BadRequest('Ten secondly rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsSecondlyDelay(): void\n {\n $e = new BadRequest('Secondly rate limit exceeded');\n $this->assertSame(1, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterReturnsDefaultWhenNoHint(): void\n {\n $e = new BadRequest('Rate limit exceeded');\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n\n public function testParseRetryAfterIgnoresNonNumericHeader(): void\n {\n $e = new DealApiException('Too Many Requests', 429, ['Retry-After' => ['not-a-number']]);\n // Falls through to message parsing; \"Too Many Requests\" has no known keyword → default 10\n $this->assertSame(10, $this->callParseRetryAfter($e));\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8016712486324069616
|
4446428687123393012
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
ClientTest
Rerun 'PHPUnit: ClientTest'
Debug 'ClientTest'
Stop 'ClientTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
144
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Crm\Hubspot;
use GuzzleHttp\Psr7\Response;
use HubSpot\Client\Crm\Associations\Api\BatchApi;
use HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId;
use HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti;
use HubSpot\Client\Crm\Associations\Model\PublicObjectId;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Deals\Api\BasicApi as DealsBasicApi;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Pipelines\Api\PipelinesApi;
use HubSpot\Client\Crm\Pipelines\Model\CollectionResponsePipeline;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\Pipeline;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Api\CoreApi;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery as HubSpotDiscovery;
use HubSpot\Discovery\Crm\Deals\Discovery as DealsDiscovery;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\SocialAccount;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\HubspotTokenManager;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Jiminny\Services\SocialAccountService;
use League\OAuth2\Client\Token\AccessToken;
use Mockery;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\NullLogger;
use SevenShores\Hubspot\Endpoints\Engagements;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Client as HubspotClient;
use SevenShores\Hubspot\Http\Response as HubspotResponse;
/**
* @runTestsInSeparateProcesses
*
* @preserveGlobalState disabled
*/
class ClientTest extends TestCase
{
private const string RESPONSE_TYPE_STAGE_FIELD = 'stage';
private const string RESPONSE_TYPE_PIPELINE_FIELD = 'pipeline';
private const string RESPONSE_TYPE_REGULAR_FIELD = 'regular';
/**
* @var Client&MockObject
*/
private Client $client;
private Configuration $config;
/**
* @var SocialAccountService&MockObject
*/
private SocialAccountService $socialAccountServiceMock;
/**
* @var HubspotPaginationService&MockObject
*/
private HubspotPaginationService $paginationServiceMock;
/**
* @var HubspotTokenManager&MockObject
*/
private HubspotTokenManager $tokenManagerMock;
/**
* @var CoreApi&MockObject
*/
private CoreApi $coreApiMock;
/**
* @var PipelinesApi&MockObject
*/
private PipelinesApi $pipelinesApiMock;
/**
* @var BatchApi&MockObject
*/
private BatchApi $associationsBatchApiMock;
/**
* @var DealsBasicApi&MockObject
*/
private DealsBasicApi $dealsBasicApiMock;
/**
* @var Engagements&MockObject
*/
private $engagementsMock;
/**
* @var HubspotClient&MockObject
*/
private HubspotClient $hubspotClientMock;
protected function setUp(): void
{
// Create mocks for dependencies
$this->socialAccountServiceMock = $this->createMock(SocialAccountService::class);
$this->paginationServiceMock = $this->createMock(HubspotPaginationService::class);
$this->tokenManagerMock = $this->createMock(HubspotTokenManager::class);
// Create a real Client instance with mocked dependencies
// Create a partial mock only for the methods we need to mock
$client = $this->createPartialMock(Client::class, ['getInstance', 'getNewInstance', 'makeRequest']);
$client->setLogger(new NullLogger());
// Inject the real dependencies using reflection
$reflection = new \ReflectionClass(Client::class);
$accountServiceProperty = $reflection->getProperty('accountService');
$accountServiceProperty->setAccessible(true);
$accountServiceProperty->setValue($client, $this->socialAccountServiceMock);
$paginationServiceProperty = $reflection->getProperty('paginationService');
$paginationServiceProperty->setAccessible(true);
$paginationServiceProperty->setValue($client, $this->paginationServiceMock);
$tokenManagerProperty = $reflection->getProperty('tokenManager');
$tokenManagerProperty->setAccessible(true);
$tokenManagerProperty->setValue($client, $this->tokenManagerMock);
$factoryMock = $this->createMock(Factory::class);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$engagementsMock = $this->createMock(\SevenShores\Hubspot\Endpoints\Engagements::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$factoryMock->method('__call')->with('engagements')->willReturn($engagementsMock);
$client->method('getInstance')->willReturn($factoryMock);
$discoveryMock = $this->createMock(HubSpotDiscovery\Discovery::class);
$crmMock = $this->createMock(HubSpotDiscovery\Crm\Discovery::class);
$associationsMock = $this->createMock(HubSpotDiscovery\Crm\Associations\Discovery::class);
$propertiesMock = $this->createMock(HubSpotDiscovery\Crm\Properties\Discovery::class);
$pipelinesMock = $this->createMock(HubSpotDiscovery\Crm\Pipelines\Discovery::class);
$coreApiMock = $this->createMock(CoreApi::class);
$pipelinesApiMock = $this->createMock(PipelinesApi::class);
$associationsBatchApiMock = $this->createMock(BatchApi::class);
$dealsBasicApiMock = $this->createMock(DealsBasicApi::class);
$propertiesMock->method('__call')->with('coreApi')->willReturn($coreApiMock);
$pipelinesMock->method('__call')->with('pipelinesApi')->willReturn($pipelinesApiMock);
$associationsMock->method('__call')->with('batchApi')->willReturn($associationsBatchApiMock);
$dealsDiscoveryMock = $this->createMock(DealsDiscovery::class);
$dealsDiscoveryMock->method('__call')->with('basicApi')->willReturn($dealsBasicApiMock);
$returnMap = ['properties' => $propertiesMock, 'pipelines' => $pipelinesMock, 'associations' => $associationsMock, 'deals' => $dealsDiscoveryMock];
$crmMock->method('__call')
->willReturnCallback(static fn (string $name) => $returnMap[$name])
;
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client->method('getNewInstance')->willReturn($discoveryMock);
$this->client = $client;
$this->config = $this->createMock(Configuration::class);
$this->client->setConfiguration($this->config);
$this->coreApiMock = $coreApiMock;
$this->pipelinesApiMock = $pipelinesApiMock;
$this->associationsBatchApiMock = $associationsBatchApiMock;
$this->dealsBasicApiMock = $dealsBasicApiMock;
$this->engagementsMock = $engagementsMock;
$this->hubspotClientMock = $hubspotClientMock;
}
public function testGetMinimumApiVersion(): void
{
$this->assertIsString($this->client->getMinimumApiVersion());
}
public function testGetInstance(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$client = new Client($socialAccountService, $paginationService, $tokenManager);
$client->setBaseUrl('[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]))
;
$this->assertEquals(
[
['id' => 'foo', 'label' => 'bar'],
['id' => 'baz', 'label' => 'qux'],
],
$this->client->fetchOpportunityPipelineStages()
);
}
public function testFetchOpportunityPipelineStagesErrorResponse(): void
{
$this->pipelinesApiMock
->method('getAll')
->with('deals')
->willReturn(new Error(['message' => 'test error']))
;
$this->assertEmpty($this->client->fetchOpportunityPipelineStages());
}
#[\PHPUnit\Framework\Attributes\DataProvider('meetingOutcomeFieldProvider')]
public function testFetchMeetingOutcomeFieldOptions(string $fieldId, string $expectedEndpoint): void
{
$field = new Field(['crm_provider_id' => $fieldId]);
$this->hubspotClientMock
->expects($this->once())
->method('request')
->with('GET', $expectedEndpoint)
->willReturn($this->generateHubSpotResponse(
[
'options' => [
['value' => 'option_1', 'label' => 'Option 1', 'displayOrder' => 0],
['value' => 'option_2', 'label' => 'Option 2', 'displayOrder' => 1],
['value' => 'option_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]
))
;
$this->assertEquals(
[
['id' => 'option_1', 'value' => 'option_1', 'label' => 'Option 1', 'display_order' => 0],
['id' => 'option_2', 'value' => 'option_2', 'label' => 'Option 2', 'display_order' => 1],
['id' => 'option_3', 'value' => 'option_3', 'label' => 'Option 3', 'display_order' => 2],
],
$this->client->fetchMeetingOutcomeFieldOptions($field)
);
}
public static function meetingOutcomeFieldProvider(): array
{
return [
'meeting outcome field' => [
'meetingOutcome',
'[URL_WITH_CREDENTIALS] The class CollectionResponsePipeline will be deprecated in the next Hubspot version
*/
$pipelineStagesResponse = new CollectionResponsePipeline([
'results' => [$this->generatePipeline()],
]);
$this->pipelinesApiMock
->method('getAll')
->willReturn($pipelineStagesResponse);
}
if ($type === self::RESPONSE_TYPE_PIPELINE_FIELD) {
$field->method('isStageField')->willReturn(false);
$field->method('isPipelineField')->willReturn(true);
$pipelineResponse = $this->generateHubSpotResponse([
'results' => [
['id' => '123', 'label' => 'Sales'],
['id' => 'default', 'label' => 'CS'],
],
]);
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($pipelineResponse);
}
$this->assertEquals(
$responses[$type],
$this->client->fetchOpportunityFieldOptions($field)
);
}
public static function opportunityFieldOptionsProvider(): array
{
return [
'stage field' => [
'field' => new Field(['crm_provider_id' => 'dealstage']),
'type' => self::RESPONSE_TYPE_STAGE_FIELD,
],
'pipeline field' => [
'field' => new Field(['crm_provider_id' => 'pipeline']),
'type' => self::RESPONSE_TYPE_PIPELINE_FIELD,
],
'regular field' => [
'field' => new Field(['crm_provider_id' => 'some_property']),
'type' => self::RESPONSE_TYPE_REGULAR_FIELD,
],
];
}
private function generateHubSpotResponse(array $data): HubspotResponse
{
return new HubspotResponse(new Response(200, [], json_encode($data)));
}
private function generateProperty(): Property
{
return new Property([
'name' => 'some_property',
'options' => [
[
'label' => 'label_1',
'value' => 'value_1',
],
[
'label' => 'label_2',
'value' => 'value_2',
],
],
]);
}
private function generatePipeline(): Pipeline
{
return new Pipeline(['stages' => [
new PipelineStage(['id' => 'foo', 'label' => 'bar']),
new PipelineStage(['id' => 'baz', 'label' => 'qux']),
]]);
}
public function testFetchOpportunityPipelines(): void
{
$this->client
->method('makeRequest')
->with('/crm/v3/pipelines/deals')
->willReturn($this->generateHubSpotResponse([
'results' => [
['id' => 'id_1', 'label' => 'Option 1', 'displayOrder' => 0],
['id' => 'id_2', 'label' => 'Option 2', 'displayOrder' => 1],
['id' => 'id_3', 'label' => 'Option 3', 'displayOrder' => 2],
],
]));
$this->assertEquals(
[
['id' => 'id_1', 'label' => 'Option 1'],
['id' => 'id_2', 'label' => 'Option 2'],
['id' => 'id_3', 'label' => 'Option 3'],
],
$this->client->fetchOpportunityPipelines()
);
}
public function testGetPaginatedData(): void
{
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
['id' => 'id_3', 'properties' => []],
];
// Mock the pagination service to return a generator and modify reference parameters
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
['payload_key' => 'payload_value'],
'foobar',
0,
$this->anything(),
$this->anything()
)
->willReturnCallback(function ($client, $payload, $type, $offset, &$total, &$lastRecordId) use ($expectedResults) {
$total = 3;
$lastRecordId = 'id_3';
foreach ($expectedResults as $result) {
yield $result;
}
});
$this->assertEquals(
[
'results' => $expectedResults,
'total' => 3,
'last_record' => 'id_3',
],
$this->client->getPaginatedData(['payload_key' => 'payload_value'], 'foobar')
);
}
public function testGetAssociationsData(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$responseResults = [];
foreach ($ids as $id) {
$from = new PublicObjectId();
$from->setId($id);
$to1 = new PublicObjectId();
$to1->setId('contact_' . $id . '_1');
$to2 = new PublicObjectId();
$to2->setId('contact_' . $id . '_2');
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to1, $to2]);
$responseResults[] = $result;
}
$batchResponse = new BatchResponsePublicAssociationMulti();
$batchResponse->setResults($responseResults);
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function (BatchInputPublicObjectId $batchInput) use ($ids) {
$inputIds = array_map(
fn ($input) => $input->getId(),
$batchInput->getInputs()
);
return $inputIds === $ids;
})
)
->willReturn($batchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$expectedResult = [
'1' => ['contact_1_1', 'contact_1_2'],
'2' => ['contact_2_1', 'contact_2_2'],
'3' => ['contact_3_1', 'contact_3_2'],
];
$this->assertEquals($expectedResult, $result);
}
public function testGetAssociationsDataHandlesException(): void
{
$ids = ['1', '2', '3'];
$fromObject = 'deals';
$toObject = 'contacts';
$exception = new \Exception('API Error');
$this->associationsBatchApiMock->expects($this->once())
->method('read')
->with(
$this->equalTo($fromObject),
$this->equalTo($toObject),
$this->callback(function ($batchInput) use ($ids) {
return $batchInput instanceof \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId
&& count($batchInput->getInputs()) === count($ids);
})
)
->willThrowException($exception);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[Hubspot] Failed to fetch associations',
[
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => 'API Error',
]
);
$this->client->setLogger($loggerMock);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertEmpty($result);
$this->assertIsArray($result);
}
public function testGetAssociationsDataWithLargeDataSet(): void
{
$ids = array_map(fn ($i) => (string) $i, range(1, 2500)); // More than 1000 items
$fromObject = 'deals';
$toObject = 'contacts';
$firstBatchResponse = new BatchResponsePublicAssociationMulti();
$firstBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, 0, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$firstBatchResponse->setResults($firstBatchResults);
$secondBatchResponse = new BatchResponsePublicAssociationMulti();
$secondBatchResults = array_map(function ($id) {
$from = new PublicObjectId();
$from->setId($id);
$to = new PublicObjectId();
$to->setId('contact_' . $id);
$result = new \HubSpot\Client\Crm\Associations\Model\PublicAssociationMulti();
$result->setFrom($from);
$result->setTo([$to]);
return $result;
}, array_slice($ids, Client::ASSOCIATIONS_BATCH_SIZE_LIMIT));
$secondBatchResponse->setResults($secondBatchResults);
$this->associationsBatchApiMock->expects($this->exactly(3))
->method('read')
->willReturnOnConsecutiveCalls($firstBatchResponse, $secondBatchResponse);
$result = $this->client->getAssociationsData($ids, $fromObject, $toObject);
$this->assertCount(2500, $result);
$this->assertArrayHasKey('1', $result);
$this->assertArrayHasKey('2500', $result);
$this->assertEquals(['contact_1'], $result['1']);
$this->assertEquals(['contact_2500'], $result['2500']);
}
public function testGetContactByEmailSuccess(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname', 'email'];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn([
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
]);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname,email', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => [
'firstname' => 'John',
'lastname' => 'Doe',
'email' => '[EMAIL]',
],
], $result);
}
public function testGetContactByEmailWithEmptyFields(): void
{
$email = '[EMAIL]';
$fields = [];
$contactMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$contactMock->method('getId')->willReturn('12345');
$contactMock->method('getProperties')->willReturn(['email' => '[EMAIL]']);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, '', null, false, 'email')
->willReturn($contactMock);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new NullLogger());
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([
'id' => '12345',
'properties' => ['email' => '[EMAIL]'],
], $result);
}
public function testGetContactByEmailApiException(): void
{
$email = '[EMAIL]';
$fields = ['firstname', 'lastname'];
$exception = new \HubSpot\Client\Crm\Contacts\ApiException('Contact not found', 404);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($email, 'firstname,lastname', null, false, 'email')
->willThrowException($exception);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('info')
->with(
'[Hubspot] Failed to fetch contact',
[
'email' => $email,
'reason' => 'Contact not found',
]
);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger($loggerMock);
$result = $client->getContactByEmail($email, $fields);
$this->assertEquals([], $result);
}
public function testGetOpportunityById(): void
{
$opportunityId = '12345';
$expectedProperties = [
'dealname' => 'Test Opportunity',
'amount' => '1000.00',
'closedate' => '2024-12-31T23:59:59.999Z',
'dealstage' => 'presentationscheduled',
'pipeline' => 'default',
];
$mockHubspotOpportunity = $this->createMock(DealWithAssociations::class);
$mockHubspotOpportunity->method('getProperties')->willReturn((object) $expectedProperties);
$mockHubspotOpportunity->method('getId')->willReturn($opportunityId);
$now = new \DateTimeImmutable();
$mockHubspotOpportunity->method('getCreatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getUpdatedAt')->willReturn($now);
$mockHubspotOpportunity->method('getArchived')->willReturn(false);
$this->dealsBasicApiMock
->expects($this->once())
->method('getById')
->willReturn($mockHubspotOpportunity);
// Assuming Client::getOpportunityById processes the SimplePublicObject and returns an associative array.
// The structure might be like: ['id' => ..., 'properties' => [...], 'createdAt' => ..., ...]
// Adjust assertions below based on the actual return structure of your method.
$result = $this->client->getOpportunityById($opportunityId, ['test', 'test']);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertEquals($opportunityId, $result['id']);
}
public function testGetContactById(): void
{
$crmId = 'contact-123';
$fields = ['firstname', 'lastname'];
$expectedProperties = ['firstname' => 'John', 'lastname' => 'Doe'];
$mockContact = $this->createMock(\HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations::class);
$mockContact->method('getId')->willReturn($crmId);
$mockContact->method('getProperties')->willReturn((object) $expectedProperties);
$contactsApiMock = $this->createMock(\HubSpot\Client\Crm\Contacts\Api\BasicApi::class);
$contactsApiMock->expects($this->once())
->method('getById')
->with($crmId, 'firstname,lastname')
->willReturn($mockContact);
$contactsDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Contacts\Discovery::class);
$contactsDiscoveryMock->method('__call')->with('basicApi')->willReturn($contactsApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($contactsDiscoveryMock) {
if ($name === 'contacts') {
return $contactsDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getContactById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testGetAccountById(): void
{
$crmId = 'account-123';
$fields = ['name', 'industry'];
$expectedProperties = ['name' => 'Acme Corp', 'industry' => 'Technology'];
$mockCompany = $this->createMock(\HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations::class);
$mockCompany->method('getId')->willReturn($crmId);
$mockCompany->method('getProperties')->willReturn((object) $expectedProperties);
$companiesApiMock = $this->createMock(\HubSpot\Client\Crm\Companies\Api\BasicApi::class);
$companiesApiMock->expects($this->once())
->method('getById')
->with($crmId, 'name,industry')
->willReturn($mockCompany);
$companiesDiscoveryMock = $this->createMock(\HubSpot\Discovery\Crm\Companies\Discovery::class);
$companiesDiscoveryMock->method('__call')->with('basicApi')->willReturn($companiesApiMock);
$crmMock = $this->createMock(\HubSpot\Discovery\Crm\Discovery::class);
$crmMock->method('__call')->willReturnCallback(function ($name) use ($companiesDiscoveryMock) {
if ($name === 'companies') {
return $companiesDiscoveryMock;
}
return $this->createMock(\HubSpot\Discovery\Crm\Properties\Discovery::class);
});
$discoveryMock = $this->createMock(\HubSpot\Discovery\Discovery::class);
$discoveryMock->method('__call')->with('crm')->willReturn($crmMock);
$client = $this->createPartialMock(Client::class, ['getNewInstance']);
$client->method('getNewInstance')->willReturn($discoveryMock);
$client->setLogger(new \Psr\Log\NullLogger());
$result = $client->getAccountById($crmId, $fields);
$this->assertIsArray($result);
$this->assertArrayHasKey('id', $result);
$this->assertArrayHasKey('properties', $result);
$this->assertEquals($crmId, $result['id']);
$this->assertEquals((object) $expectedProperties, $result['properties']);
}
public function testEnsureValidTokenWithNoTokenUpdate(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
$originalToken = 'original_token';
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$accessTokenProperty->setValue($this->client, $originalToken);
// Mock token manager to return null (no refresh needed)
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn(null);
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was not changed
$this->assertEquals($originalToken, $accessTokenProperty->getValue($this->client));
}
public function testGetPaginatedDataGeneratorDelegatesToPaginationService(): void
{
$payload = ['filters' => []];
$type = 'contacts';
$offset = 0;
$total = 0;
$lastRecordId = null;
$expectedResults = [
['id' => 'id_1', 'properties' => []],
['id' => 'id_2', 'properties' => []],
];
// Mock the pagination service to return a generator
$this->paginationServiceMock
->expects($this->once())
->method('getPaginatedDataGenerator')
->with(
$this->client,
$payload,
$type,
$offset,
$this->anything(),
$this->anything()
)
->willReturnCallback(function () use ($expectedResults) {
foreach ($expectedResults as $result) {
yield $result;
}
});
// Execute the pagination
$results = [];
foreach ($this->client->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastRecordId) as $result) {
$results[] = $result;
}
$this->assertCount(2, $results);
$this->assertEquals('id_1', $results[0]['id']);
$this->assertEquals('id_2', $results[1]['id']);
}
public function testEnsureValidTokenDelegatesToTokenManager(): void
{
$socialAccountMock = $this->createMock(SocialAccount::class);
// Set up OAuth account
$reflection = new \ReflectionClass($this->client);
$oauthAccountProperty = $reflection->getProperty('oauthAccount');
$oauthAccountProperty->setAccessible(true);
$oauthAccountProperty->setValue($this->client, $socialAccountMock);
// Mock token manager to return new token
$this->tokenManagerMock
->expects($this->once())
->method('ensureValidToken')
->with($socialAccountMock)
->willReturn('new_access_token');
// Call ensureValidToken
$this->client->ensureValidToken();
// Verify access token was updated
$accessTokenProperty = $reflection->getProperty('accessToken');
$accessTokenProperty->setAccessible(true);
$this->assertEquals('new_access_token', $accessTokenProperty->getValue($this->client));
}
public function testGetOwnersArchivedWithValidResponse(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => true,
],
],
];
// Create a mock response object
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
// Set up the client to return our test data
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=true'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(true);
// Assert the results
$this->assertCount(1, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('John Doe', $result[0]->getFullName());
$this->assertTrue($result[0]->isArchived());
}
public function testGetOwnersArchivedWithEmptyResponse(): void
{
// Create a mock response object with empty results
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn(['results' => []]);
// Set up the client to return empty results
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
// Call the method
$result = $this->client->getOwnersArchived(false);
// Assert the results
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithInvalidResponse(): void
{
// Create a mock response that will throw an exception when toArray is called
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willThrowException(new \InvalidArgumentException('Invalid JSON'));
// Set up the client to return the problematic response
$this->client->method('makeRequest')
->willReturn($response);
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(true);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithHttpError(): void
{
// Set up the client to throw an exception
$this->client->method('makeRequest')
->willThrowException(new \Exception('HTTP Error'));
// Mock the logger to expect an error message
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with($this->stringContains('Failed to fetch owners'));
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
// Call the method and expect an empty array on error
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertEmpty($result);
}
public function testGetOwnersArchivedWithOwnerCreationException(): void
{
$responseData = [
'results' => [
[
'id' => '123',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'John',
'lastName' => 'Doe',
'userId' => 456,
'userIdIncludingInactive' => 789,
'createdAt' => '2023-01-01T12:00:00Z',
'updatedAt' => '2023-01-02T12:00:00Z',
'archived' => false,
],
[
'id' => '456',
'email' => '[EMAIL]',
'type' => 'PERSON',
'createdAt' => 'invalid-date-format',
],
[
'id' => '789',
'email' => '[EMAIL]',
'type' => 'PERSON',
'firstName' => 'Jane',
'lastName' => 'Smith',
'userId' => 999,
'userIdIncludingInactive' => 888,
'createdAt' => '2023-01-03T12:00:00Z',
'updatedAt' => '2023-01-04T12:00:00Z',
'archived' => false,
],
],
];
$response = $this->createMock(\SevenShores\Hubspot\Http\Response::class);
$response->method('toArray')
->willReturn($responseData);
$this->client->method('makeRequest')
->with(
'/crm/v3/owners',
'GET',
[],
'archived=false'
)
->willReturn($response);
$loggerMock = $this->createMock(\Psr\Log\LoggerInterface::class);
$loggerMock->expects($this->once())
->method('error')
->with(
'[HubSpot] Failed to process owner data',
$this->callback(function ($context) {
return isset($context['result']) &&
isset($context['error']) &&
$context['result']['id'] === '456' &&
$context['result']['email'] === '[EMAIL]' &&
str_contains($context['error'], 'invalid-date-format');
})
);
$reflection = new \ReflectionClass($this->client);
$loggerProperty = $reflection->getProperty('log');
$loggerProperty->setAccessible(true);
$loggerProperty->setValue($this->client, $loggerMock);
$result = $this->client->getOwnersArchived(false);
$this->assertIsArray($result);
$this->assertCount(2, $result);
$this->assertEquals('123', $result[0]->getId());
$this->assertEquals('[EMAIL]', $result[0]->getEmail());
$this->assertEquals('789', $result[1]->getId());
$this->assertEquals('[EMAIL]', $result[1]->getEmail());
}
public function testMakeRequestWithGetMethod(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService::class);
$tokenManager = $this->createMock(HubspotTokenManager::class);
$psrResponse = new Response(200, [], json_encode(['status' => 'success']));
$expectedResponse = new HubspotResponse($psrResponse);
$hubspotClientMock = $this->createMock(HubspotClient::class);
$hubspotClientMock->expects($this->once())
->method('request')
->with(
'GET',
'https://api.hubapi.com/crm/v3/objects/contacts',
[],
null,
true
)
->willReturn($expectedResponse);
$factoryMock = $this->createMock(Factory::class);
$factoryMock->method('getClient')->willReturn($hubspotClientMock);
$client = $this->getMockBuilder(Client::class)
->setConstructorArgs([$socialAccountService, $paginationService, $tokenManager])
->onlyMethods(['getInstance'])
->getMock();
$client->method('getInstance')->willReturn($factoryMock);
$client->setAccessToken(new AccessToken(['access_token' => 'test_token']));
$result = $client->makeRequest('/crm/v3/objects/contacts', 'GET');
$this->assertSame($expectedResponse, $result);
}
public function testMakeRequestWithGetMethodAndQueryString(): void
{
$socialAccountService = $this->createMock(SocialAccountService::class);
$paginationService = $this->createMock(HubspotPaginationService...
|
20553
|
NULL
|
NULL
|
NULL
|
|
22354
|
968
|
63
|
2026-05-12T07:02:49.575574+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778569369575_m1.jpg...
|
Firefox
|
Work — Mozilla Firefox
|
True
|
github.com/jiminny/app/pull/12036
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20773] User Pilot not receiving events on report generated - Jira
[JY-20773] User Pilot not receiving events on report generated - Jira
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
[JY-20776] Automated report - sentry - Jira
[JY-20776] Automated report - sentry - Jira
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
github.com/jiminny/app/pull/12036
github.com/jiminny/app/pull/12036
Close tab
JY-20361: Add call scores in Panorama by steliyan-g · Pull Request #507 · jiminny/prophet
JY-20361: Add call scores in Panorama by steliyan-g · Pull Request #507 · jiminny/prophet
LLM API Pricing Comparison & Cost Guide (May 2026)
LLM API Pricing Comparison & Cost Guide (May 2026)
New Tab
Customize sidebar...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20773] User Pilot not receiving events on report generated - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20773] User Pilot not receiving events on report generated - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20776] Automated report - sentry - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20776] Automated report - sentry - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"github.com/jiminny/app/pull/12036","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"github.com/jiminny/app/pull/12036","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-20361: Add call scores in Panorama by steliyan-g · Pull Request #507 · jiminny/prophet","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20361: Add call scores in Panorama by steliyan-g · Pull Request #507 · jiminny/prophet","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"LLM API Pricing Comparison & Cost Guide (May 2026)","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LLM API Pricing Comparison & Cost Guide (May 2026)","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
-8016005919011244180
|
-2722124554616194420
|
visual_change
|
accessibility
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20773] User Pilot not receiving events on report generated - Jira
[JY-20773] User Pilot not receiving events on report generated - Jira
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
[JY-20776] Automated report - sentry - Jira
[JY-20776] Automated report - sentry - Jira
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
github.com/jiminny/app/pull/12036
github.com/jiminny/app/pull/12036
Close tab
JY-20361: Add call scores in Panorama by steliyan-g · Pull Request #507 · jiminny/prophet
JY-20361: Add call scores in Panorama by steliyan-g · Pull Request #507 · jiminny/prophet
LLM API Pricing Comparison & Cost Guide (May 2026)
LLM API Pricing Comparison & Cost Guide (May 2026)
New Tab
Customize sidebar...
|
22352
|
NULL
|
NULL
|
NULL
|
|
17431
|
772
|
11
|
2026-05-11T10:23:05.216463+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778494985216_m1.jpg...
|
Firefox
|
Screenpipe — Archive — Personal
|
True
|
app.screenpipe.lakylak.xyz
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Previous month
May 2026
Next month
Mon
Tue
Wed
Thu Previous month
May 2026
Next month
Mon
Tue
Wed
Thu
Fri
Sat
Sun
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
Mon
27
4
11
18
25
1
Tue
28
5
12
19
26
New Tab
New Tab
Screenpipe — Archive
Screenpipe — Archive
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe [archive.db · 12323.6MB]
Screenpipe
[archive.db · 12323.6MB]
Activity
Search
Audio
Work Report
Timetable
AI Summary
Date
07
/
05
/...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Previous month","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"May 2026","depth":10,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next month","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Mon","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tue","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Wed","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Thu","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Fri","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sat","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Sun","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"27","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"28","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"29","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"30","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"3","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"6","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"8","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"9","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"10","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"12","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"13","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"16","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"18","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"19","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"21","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"22","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"23","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"24","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"25","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"26","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"27","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"28","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"29","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"30","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"31","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"3","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"6","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"7","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Mon","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"27","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"18","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"25","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tue","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"28","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"12","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"19","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"26","depth":11,"on_screen":true,"subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Screenpipe — Archive","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.48576388,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.5086806,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.53194445,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.5552083,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"bounds":{"left":0.5784722,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Screenpipe [archive.db · 12323.6MB]","depth":7,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Screenpipe","depth":8,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"[archive.db · 12323.6MB]","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Activity","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Search","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Audio","depth":7,"on_screen":true,"help_text":"No audio data in this database","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Work Report","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Timetable","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Summary","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Date","depth":8,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"07","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"05","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":8,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-8014774417746747614
|
-720553341520726392
|
click
|
accessibility
|
NULL
|
Previous month
May 2026
Next month
Mon
Tue
Wed
Thu Previous month
May 2026
Next month
Mon
Tue
Wed
Thu
Fri
Sat
Sun
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
Mon
27
4
11
18
25
1
Tue
28
5
12
19
26
New Tab
New Tab
Screenpipe — Archive
Screenpipe — Archive
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Screenpipe [archive.db · 12323.6MB]
Screenpipe
[archive.db · 12323.6MB]
Activity
Search
Audio
Work Report
Timetable
AI Summary
Date
07
/
05
/...
|
17428
|
NULL
|
NULL
|
NULL
|
|
2103
|
97
|
28
|
2026-05-07T11:01:52.961930+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778151712961_m1.jpg...
|
PhpStorm
|
faVsco.js – console [STAGING]
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp<(ah]Support Daily • in 59 m100% <78Thu 7 May 14:01:53STAGE (ssh)*3181DOCKER*1DEV (-zsh)882APP (-zsh)X M1DOCKER (docker-compose)NFO""component" :"o.e.n.Node""cluster.name":"docker-cluster""node. name": "e802ad473a4f""message":"version[7.10.2],pid[6],build[default/docker/747e1cc71def077253878a59143c1f785afa92b9/2021-01-13T04:42:47.157277Z], OS[Linux/6.12.54-linuxkit/aarch64], JVM[AdoptOpenJDK/OpenJDK 64-Bit Server VM/15.0.1/15.0.1+9]" }elasticsearchNFO"1 {"type": "server""timestamp" :"2026-05-07T11:01:45, 628Z""component":"o.e.n.Node","cluster.name":"docker-cluster","node.name".e802ad473a4f""message": "JVM home [/usr/share/elasticsearch/jdk], using bundled JDK [true]"elasticsearch1 {"type":"server""timestamp" :"2026-05-07T11:01:45,628Z","Level":"INFO"component":"o.e.n.Node""cluster.name":"docker-cluster""node. name":"e802ad473a4f""message":"JVM arguments [-Xshare:auto,-Des.networkaddress.cache.ttl=60,-Des.networkaddress.cache.negative.ttl=10, -XX:+AlwaysPreTouch,-Xss1m, -Djava.awt.headless=true,-Dfile.encoding=UTF-8, -Djna.nosys=true,-XX: -0mitStackTraceInFastThrow,-XX: +ShowCodeDetailsInExceptionMessages, -Dio.netty.noUnsafe=true,-Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dio.netty.allocator.numDirectArenas=0,-Dlog4j.shutdownHookEnabled=false,-Dlog4j2.disable.jmx=true,-Djava.locale.providers-SPI, COMPAT,-Xms1g,-Xmx1g, -XX:+UseG1GC,cupancyPercent=30,-XX: G1ReservePercent=25,-XX:InitiatingHeap0c-Djava.io.tmpdir=/tmp/elasticsearch-11320774102753104301, -XX:+HeapDumpOnOut0fMemoryError, -XX:HeapDumpPath=data, -XX:ErrorFile=logs/hs_err_pid%p.log, -X1og:gc*,gc+age=trace, safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32, filesize=64m,-Des.cgroups.hierarchy.override=/, -Xms700m, -Xmx700m,-XX:MaxDirectMemorySize=367001600-Des.path.home=/usr/share/elasticsearch,-Des.path.conf=/usr/share/elasticsearch/config,-Des.distribution.flavor=default,-Des.distribution.type=docker, -Des.bundled_jdk=true]" }docker_lamp_1I Installing dependencies from lock file (including require-dev)docker_lamp_1Verifyingcan be installed on current platform.docker_lamp_1operations:0 installs,2 updates,docker_lamp_11 As therecommand installed zipfiles are being unpackedusingzip extension.docker_lamp_1I This may cause invalid reportscorrupted archives. Besides, any UNIXpermissions (e.g.executable) defined in the archives will be lost.docker_lamp_1Installingdocker_lamp_1'unzip' or '7z' (21.01+) may remediate them.Downloading symfony/polyfill-php85 (v1.37.0)docker_lamp_1Syncing symfony/error-handler (v7.4.8) into cachedocker_lamp_1Failed to download symfony/polyfill-php85from dist: Could notauthenticateagainst github.comdocker_lamp_1Now trying to download fromdocker_lamp_1docker_1amp_1- Syncing symfony/polyfill-php85 (v1.37.0) into cachedocker_lamp_11/1 C-] 100%docker_lamp_1docker_lamp_1Removing symfony/debug (v4.4.44)Removing symfony/polyfill-php85 (v1.33.0)-zsh• 84screenpipe*PROD (ssh)Run'do-release-upgrade' to upgrade to it.• *5-zsh|*** System restart required ***Last login: Mon Apr 27 07:45:272026 from 212.5.153.87lukas@jiminny-prod-bastion:~$ 0X T3 EU (-zsh)Last login: Thu May7 09:29:14 on consolePoetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)Run 'do-release-upgrade' to upgrade to it.*** System restart required ***Last login: Tue Apr 28 06:25:10 2026 from 212.5.153.87stage-bastiin:-$T5QA (-zsh)Last login: Thu May 7 09:44:56on ttys002Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentsX 16 FE (-zsh)Last login: Thu May 7 09:44:56on ttys004₴6PRODSTAGEPoetry could not find a pyproject.toml file in /Users/lukas or its parentsFRONTENDPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ IEXT (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsEXTENSIONPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|View in Docker DesktopView ConfigEnable Watch...
|
NULL
|
-8014479133950209600
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp<(ah]Support Daily • in 59 m100% <78Thu 7 May 14:01:53STAGE (ssh)*3181DOCKER*1DEV (-zsh)882APP (-zsh)X M1DOCKER (docker-compose)NFO""component" :"o.e.n.Node""cluster.name":"docker-cluster""node. name": "e802ad473a4f""message":"version[7.10.2],pid[6],build[default/docker/747e1cc71def077253878a59143c1f785afa92b9/2021-01-13T04:42:47.157277Z], OS[Linux/6.12.54-linuxkit/aarch64], JVM[AdoptOpenJDK/OpenJDK 64-Bit Server VM/15.0.1/15.0.1+9]" }elasticsearchNFO"1 {"type": "server""timestamp" :"2026-05-07T11:01:45, 628Z""component":"o.e.n.Node","cluster.name":"docker-cluster","node.name".e802ad473a4f""message": "JVM home [/usr/share/elasticsearch/jdk], using bundled JDK [true]"elasticsearch1 {"type":"server""timestamp" :"2026-05-07T11:01:45,628Z","Level":"INFO"component":"o.e.n.Node""cluster.name":"docker-cluster""node. name":"e802ad473a4f""message":"JVM arguments [-Xshare:auto,-Des.networkaddress.cache.ttl=60,-Des.networkaddress.cache.negative.ttl=10, -XX:+AlwaysPreTouch,-Xss1m, -Djava.awt.headless=true,-Dfile.encoding=UTF-8, -Djna.nosys=true,-XX: -0mitStackTraceInFastThrow,-XX: +ShowCodeDetailsInExceptionMessages, -Dio.netty.noUnsafe=true,-Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dio.netty.allocator.numDirectArenas=0,-Dlog4j.shutdownHookEnabled=false,-Dlog4j2.disable.jmx=true,-Djava.locale.providers-SPI, COMPAT,-Xms1g,-Xmx1g, -XX:+UseG1GC,cupancyPercent=30,-XX: G1ReservePercent=25,-XX:InitiatingHeap0c-Djava.io.tmpdir=/tmp/elasticsearch-11320774102753104301, -XX:+HeapDumpOnOut0fMemoryError, -XX:HeapDumpPath=data, -XX:ErrorFile=logs/hs_err_pid%p.log, -X1og:gc*,gc+age=trace, safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32, filesize=64m,-Des.cgroups.hierarchy.override=/, -Xms700m, -Xmx700m,-XX:MaxDirectMemorySize=367001600-Des.path.home=/usr/share/elasticsearch,-Des.path.conf=/usr/share/elasticsearch/config,-Des.distribution.flavor=default,-Des.distribution.type=docker, -Des.bundled_jdk=true]" }docker_lamp_1I Installing dependencies from lock file (including require-dev)docker_lamp_1Verifyingcan be installed on current platform.docker_lamp_1operations:0 installs,2 updates,docker_lamp_11 As therecommand installed zipfiles are being unpackedusingzip extension.docker_lamp_1I This may cause invalid reportscorrupted archives. Besides, any UNIXpermissions (e.g.executable) defined in the archives will be lost.docker_lamp_1Installingdocker_lamp_1'unzip' or '7z' (21.01+) may remediate them.Downloading symfony/polyfill-php85 (v1.37.0)docker_lamp_1Syncing symfony/error-handler (v7.4.8) into cachedocker_lamp_1Failed to download symfony/polyfill-php85from dist: Could notauthenticateagainst github.comdocker_lamp_1Now trying to download fromdocker_lamp_1docker_1amp_1- Syncing symfony/polyfill-php85 (v1.37.0) into cachedocker_lamp_11/1 C-] 100%docker_lamp_1docker_lamp_1Removing symfony/debug (v4.4.44)Removing symfony/polyfill-php85 (v1.33.0)-zsh• 84screenpipe*PROD (ssh)Run'do-release-upgrade' to upgrade to it.• *5-zsh|*** System restart required ***Last login: Mon Apr 27 07:45:272026 from 212.5.153.87lukas@jiminny-prod-bastion:~$ 0X T3 EU (-zsh)Last login: Thu May7 09:29:14 on consolePoetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)Run 'do-release-upgrade' to upgrade to it.*** System restart required ***Last login: Tue Apr 28 06:25:10 2026 from 212.5.153.87stage-bastiin:-$T5QA (-zsh)Last login: Thu May 7 09:44:56on ttys002Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentsX 16 FE (-zsh)Last login: Thu May 7 09:44:56on ttys004₴6PRODSTAGEPoetry could not find a pyproject.toml file in /Users/lukas or its parentsFRONTENDPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ IEXT (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsEXTENSIONPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|View in Docker DesktopView ConfigEnable Watch...
|
2101
|
NULL
|
NULL
|
NULL
|
|
26620
|
1102
|
10
|
2026-05-12T12:48:19.436920+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778590099436_m1.jpg...
|
Code
|
screenpipe_sync.sh — screenpipe [SSH: nas] — Modif screenpipe_sync.sh — screenpipe [SSH: nas] — Modified...
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G) - 11 pending changes
11
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
logs
pipes
.gitignore
app_settings.json
archive.db
archive.db-bak
U
archive.db.bak-pre-installid
db.sqlite
db.sqlite-shm
db.sqlite-wal
screenpipe_fts_migrate.sh
screenpipe_sync_updated.sh
U
screenpipe_sync.sh
M
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
screenpipe_fts_migrate.sh, Editor Group 1
screenpipe_sync_updated.sh, preview, Editor Group 1
pipe.md, Editor Group 1
.env, Editor Group 1
done
step "Reconciling NAS schema with source"
for tbl in "${ALL_SYNC_TABLES[@]}"; do
ensure_columns "$tbl"
done
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
-- vision
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_frames_document_path ON frames(document_path) WHERE document_path IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(install_id, frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(install_id, frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_elements_onscreen_frame ON elements(install_id, frame_id) WHERE on_screen = 1 AND text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(install_id, frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(install_id, frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
-- audio
CREATE INDEX IF NOT EXISTS nas.idx_audio_chunks_timestamp ON audio_chunks(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_audio_trans_chunk_id ON audio_transcriptions(install_id, audio_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_audio_trans_timestamp ON audio_transcriptions(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_audio_trans_speaker ON audio_transcriptions(install_id, speaker_id, timestamp DESC);
CREATE INDEX IF NOT EXISTS nas.idx_speaker_emb_speaker_id ON speaker_embeddings(install_id, speaker_id);
CREATE INDEX IF NOT EXISTS nas.idx_audio_tags_chunk_id ON audio_tags(install_id, audio_chunk_id);
DETACH nas;
"
# ─── FTS TABLES (contentless, install-safe) ───────────────────────────────
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url,
install_id UNINDEXED, source_id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role,
install_id UNINDEXED, source_id UNINDEXED, frame_id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content, app_name, window_title, element_name,
install_id UNINDEXED, source_id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.audio_transcriptions_fts USING fts5(
transcription, device,
speaker_id UNINDEXED, install_id UNINDEXED, source_id UNINDEXED,
tokenize='unicode61'
);
DETACH nas;
"
# ─── BUILD COLUMN LISTS ───────────────────────────────────────────────────
FRAMES_COLS=$(build_col_list frames)
ELEMENTS_COLS=$(build_col_list elements)
ELEMENTS_COLS_E=$(build_col_list elements e)
UI_EVENTS_COLS=$(build_col_list ui_events)
OCR_TEXT_COLS=$(build_col_list ocr_text)
OCR_TEXT_COLS_O=$(build_col_list ocr_text o)
VIDEO_CHUNKS_COLS=$(build_col_list video_chunks)
MEETINGS_COLS=$(build_col_list meetings)
ACHUNKS_COLS=$(build_col_list audio_chunks)
ATRANS_COLS=$(build_col_list audio_transcriptions)
ATRANS_COLS_T=$(build_col_list audio_transcriptions t)
SPEAKERS_COLS=$(build_col_list speakers)
SEMB_COLS=$(build_col_list speaker_embeddings)
ATAGS_COLS=$(build_col_list audio_tags)
ATAGS_COLS_AT=$(build_col_list audio_tags at)
TAGS_COLS=$(build_col_list tags)
VTAGS_COLS=$(build_col_list vision_tags)
VTAGS_COLS_VT=$(build_col_list vision_tags vt)
# ─── SYNC VISION DATA ─────────────────────────────────────────────────────
step "Syncing vision data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks ($VIDEO_CHUNKS_COLS, install_id)
SELECT $VIDEO_CHUNKS_COLS, '$INSTALL_ID' FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames ($FRAMES_COLS, install_id)
SELECT $FRAMES_COLS, '$INSTALL_ID' FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text ($OCR_TEXT_COLS, install_id)
SELECT $OCR_TEXT_COLS_O, '$INSTALL_ID' FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events ($UI_EVENTS_COLS, install_id)
SELECT $UI_EVENTS_COLS, '$INSTALL_ID' FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements ($ELEMENTS_COLS, install_id)
SELECT $ELEMENTS_COLS_E, '$INSTALL_ID' FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings ($MEETINGS_COLS, install_id)
SELECT $MEETINGS_COLS, '$INSTALL_ID' FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── SYNC AUDIO DATA ──────────────────────────────────────────────────────
step "Syncing audio data for $TARGET_DATE"
run_sqlite_heredoc "speakers ($SRC_SPEAKERS rows, all)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.speakers ($SPEAKERS_COLS, install_id)
SELECT $SPEAKERS_COLS, '$INSTALL_ID' FROM main.speakers;
DETACH nas;
"
run_sqlite_heredoc "speaker_embeddings ($SRC_SEMB rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.speaker_embeddings ($SEMB_COLS, install_id)
SELECT $SEMB_COLS, '$INSTALL_ID' FROM main.speaker_embeddings;
DETACH nas;
"
run_sqlite_heredoc "audio_chunks ($SRC_ACHUNKS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.audio_chunks ($ACHUNKS_COLS, install_id)
SELECT $ACHUNKS_COLS, '$INSTALL_ID' FROM main.audio_chunks WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "audio_transcriptions ($SRC_ATRANS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.audio_transcriptions ($ATRANS_COLS, install_id)
SELECT $ATRANS_COLS_T, '$INSTALL_ID' FROM main.audio_transcriptions t
JOIN main.audio_chunks c ON t.audio_chunk_id = c.id
WHERE date(c.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "audio_tags ($SRC_ATAGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.audio_tags ($ATAGS_COLS, install_id)
SELECT $ATAGS_COLS_AT, '$INSTALL_ID' FROM main.audio_tags at
JOIN main.audio_chunks c ON at.audio_chunk_id = c.id
WHERE date(c.timestamp) = '$TARGET_DATE';
DETACH nas;
"
# ─── SYNC SHARED ──────────────────────────────────────────────────────────
step "Syncing shared tables (tags, vision_tags)"
run_sqlite_heredoc "tags ($SRC_TAGS rows, all)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.tags ($TAGS_COLS, install_id)
SELECT $TAGS_COLS, '$INSTALL_ID' FROM main.tags;
DETACH nas;
"
run_sqlite_heredoc "vision_tags ($SRC_VTAGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.vision_tags ($VTAGS_COLS, install_id)
SELECT $VTAGS_COLS_VT, '$INSTALL_ID' FROM main.vision_tags vt
JOIN main.frames f ON vt.vision_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE (contentless, auto-rowid, no collisions) ──────────────────
# No `rowid` specified; SQLite assigns a fresh one. install_id + source_id
# are UNINDEXED columns so JOIN-back-to-base queries work.
step "Updating FTS indexes"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(full_text, app_name, window_name, browser_url, install_id, source_id)
SELECT full_text, app_name, window_name, browser_url, install_id, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND install_id = '$INSTALL_ID'
AND full_text IS NOT NULL AND full_text != '';
DETACH nas;
"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(text, role, install_id, source_id, frame_id)
SELECT e.text, e.role, e.install_id, e.id, e.frame_id
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id AND e.install_id = f.install_id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.install_id = '$INSTALL_ID'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(text_content, app_name, window_title, element_name, install_id, source_id)
SELECT text_content, app_name, window_title, element_name, install_id, id
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND install_id = '$INSTALL_ID'
AND text_content IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "audio_transcriptions_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.audio_transcriptions_fts(transcription, device, speaker_id, install_id, source_id)
SELECT t.transcription, COALESCE(t.device,''), t.speaker_id, t.install_id, t.id
FROM nas.audio_transcriptions t
JOIN nas.audio_chunks c ON t.audio_chunk_id = c.id AND t.install_id = c.install_id
WHERE date(c.timestamp) = '$TARGET_DATE'
AND t.install_id = '$INSTALL_ID'
AND t.transcription IS NOT NULL AND t.transcription != '';
DETACH nas;
"
# ─── VERIFY ───────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE install_id='$INSTALL_ID' AND frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE install_id='$INSTALL_ID' AND frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_ACHUNKS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_ATRANS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM audio_transcriptions WHERE install_id='$INSTALL_ID' AND audio_chunk_id IN (SELECT id FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_ATAGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM audio_tags WHERE install_id='$INSTALL_ID' AND audio_chunk_id IN (SELECT id FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_VTAGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM vision_tags WHERE install_id='$INSTALL_ID' AND vision_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
check "audio_chunks" "$V_ACHUNKS" "$SRC_ACHUNKS"
check "audio_transcriptions" "$V_ATRANS" "$SRC_ATRANS"
check "audio_tags" "$V_ATAGS" "$SRC_ATAGS"
check "vision_tags" "$V_VTAGS" "$SRC_VTAGS"
fi
# ─── COPY FRAME DATA FOLDER ──────────────────────────────────────────────────
step "Copying frame data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-40s " "rsync frames → NAS"
rsync -a --ignore-existing "$DATA_SRC/" "$NAS_DATA/$TARGET_DATE/" 2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" 2>/dev/null | grep -v '^audio$' | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -ge "$SRC_FILES" ]; then
printf "\r %-40s ✓ %dm%02ds (%s files, %s)\n" \
"rsync frames → NAS" "$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-40s ✗ %s / %s files\n" "rsync frames → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-40s %s\n" "rsync frames → NAS" "skipped (no source dir)"
fi
# ─── COPY AUDIO FILES ────────────────────────────────────────────────────────
# Audio is flat in ~/.screenpipe/data/ with date in filename, e.g.
# System Audio (output)_2026-05-11_13-48-12.mp4
# soundcore AeroClip (input)_2026-05-10_11-10-32.mp4
# Mirror to $NAS_DATA/<date>/audio/ so each day's archive is self-contained.
step "Copying audio files for $TARGET_DATE"
shopt -s nullglob
AUDIO_FILES=( "$HOME/.screenpipe/data/"*_"${TARGET_DATE}"_*.mp4 )
shopt -u nullglob
if [ ${#AUDIO_FILES[@]} -gt 0 ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE/audio"
RSYNC_START=$(date +%s)
printf " %-40s " "rsync audio → NAS"
rsync -a --ignore-existing "${AUDIO_FILES[@]}" "$NAS_DATA/$TARGET_DATE/audio/" 2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_AUDIO=$(ls "$NAS_DATA/$TARGET_DATE/audio" | wc -l | tr -d ' ')
AUDIO_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE/audio" | cut -f1)
printf "\r %-40s ✓ %dm%02ds (%s files, %s)\n" \
"rsync audio → NAS" "$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_AUDIO" "$AUDIO_SIZE" | tee -a "$LOG_FILE"
else
printf " %-40s %s\n" "rsync audio → NAS" "skipped (no audio for date)"
fi
# ─── COPY LOGS ────────────────────────────────────────────────────────────────
step "Copying screenpipe logs for $TARGET_DATE"
NAS_LOGS="$NAS_MOUNT/logs"
mkdir -p "$NAS_LOGS"
shopt -s nullglob
LOG_FILES=( "$HOME/.screenpipe/screenpipe.$TARGET_DATE."*.log )
shopt -u nullglob
if [ ${#LOG_FILES[@]} -gt 0 ]; then
printf " %-40s " "rsync logs → NAS"
rsync -a "${LOG_FILES[@]}" "$NAS_LOGS/" 2>>"$LOG_FILE"
TOTAL_SIZE=$(du -ch "${LOG_FILES[@]}" | tail -1 | cut -f1)
printf "✓ %d file(s), %s\n" "${#LOG_FILES[@]}" "$TOTAL_SIZE" | tee -a "$LOG_FILE"
else
printf " %-40s %s\n" "rsync logs → NAS" "skipped (no matching logs)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE (install $INSTALL_ID)"
log "========================================"
rsync -a "$HOME/.screenpipe/sync.log" "$NAS_LOGS/sync.log" 2>/dev/null || true
done
step "Reconciling NAS schema with source"
for tbl in "${ALL_SYNC_TABLES[@]}"; do
ensure_columns "$tbl"
done
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
-- vision
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_frames_document_path ON frames(document_path) WHERE document_path IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(install_id, frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(install_id, frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_elements_onscreen_frame ON elements(install_id, frame_id) WHERE on_screen = 1 AND text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(install_id, frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(install_id, frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
-- audio
CREATE INDEX IF NOT EXISTS nas.idx_audio_chunks_timestamp ON audio_chunks(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_audio_trans_chunk_id ON audio_transcriptions(install_id, audio_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_audio_trans_timestamp ON audio_transcriptions(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_audio_trans_speaker ON audio_transcriptions(install_id, speaker_id, timestamp DESC);
CREATE INDEX IF NOT EXISTS nas.idx_speaker_emb_speaker_id ON speaker_embeddings(install_id, speaker_id);
CREATE INDEX IF NOT EXISTS nas.idx_audio_tags_chunk_id ON audio_tags(install_id, audio_chunk_id);
DETACH nas;
"
# ─── FTS TABLES (contentless, install-safe) ───────────────────────────────
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url,
install_id UNINDEXED, source_id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role,
install_id UNINDEXED, source_id UNINDEXED, frame_id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content, app_name, window_title, element_name,
install_id UNINDEXED, source_id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.audio_transcriptions_fts USING fts5(
transcription, device,
speaker_id UNINDEXED, install_id UNINDEXED, source_id UNINDEXED,
tokenize='unicode61'
);
DETACH nas;
"
# ─── BUILD COLUMN LISTS ───────────────────────────────────────────────────
FRAMES_COLS=$(build_col_list frames)
ELEMENTS_COLS=$(build_col_list elements)
ELEMENTS_COLS_E=$(build_col_list elements e)
UI_EVENTS_COLS=$(build_col_list ui_events)
OCR_TEXT_COLS=$(build_col_list ocr_text)
OCR_TEXT_COLS_O=$(build_col_list ocr_text o)
VIDEO_CHUNKS_COLS=$(build_col_list video_chunks)
MEETINGS_COLS=$(build_col_list meetings)
ACHUNKS_COLS=$(build_col_list audio_chunks)
ATRANS_COLS=$(build_col_list audio_transcriptions)
ATRANS_COLS_T=$(build_col_list audio_transcriptions t)
SPEAKERS_COLS=$(build_col_list speakers)
SEMB_COLS=$(build_col_list speaker_embeddings)
ATAGS_COLS=$(build_col_list audio_tags)
ATAGS_COLS_AT=$(build_col_list audio_tags at)
TAGS_COLS=$(build_col_list tags)
VTAGS_COLS=$(build_col_list vision_tags)
VTAGS_COLS_VT=$(build_col_list vision_tags vt)
# ─── SYNC VISION DATA ─────────────────────────────────────────────────────
step "Syncing vision data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks ($VIDEO_CHUNKS_COLS, install_id)
SELECT $VIDEO_CHUNKS_COLS, '$INSTALL_ID' FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames ($FRAMES_COLS, install_id)
SELECT $FRAMES_COLS, '$INSTALL_ID' FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text ($OCR_TEXT_COLS, install_id)
SELECT $OCR_TEXT_COLS_O, '$INSTALL_ID' FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events ($UI_EVENTS_COLS, install_id)
SELECT $UI_EVENTS_COLS, '$INSTALL_ID' FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements ($ELEMENTS_COLS, install_id)
SELECT $ELEMENTS_COLS_E, '$INSTALL_ID' FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings ($MEETINGS_COLS, install_id)
SELECT $MEETINGS_COLS, '$INSTALL_ID' FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── SYNC AUDIO DATA ──────────────────────────────────────────────────────
step "Syncing audio data for $TARGET_DATE"
run_sqlite_heredoc "speakers ($SRC_SPEAKERS rows, all)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.speakers ($SPEAKERS_COLS, install_id)
SELECT $SPEAKERS_COLS, '$INSTALL_ID' FROM main.speakers;
DETACH nas;
"
run_sqlite_heredoc "speaker_embeddings ($SRC_SEMB rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.speaker_embeddings ($SEMB_COLS, install_id)
SELECT $SEMB_COLS, '$INSTALL_ID' FROM main.speaker_embeddings;
DETACH nas;
"
run_sqlite_heredoc "audio_chunks ($SRC_ACHUNKS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.audio_chunks ($ACHUNKS_COLS, install_id)
SELECT $ACHUNKS_COLS, '$INSTALL_ID' FROM main.audio_chunks WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "audio_transcriptions ($SRC_ATRANS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.audio_transcriptions ($ATRANS_COLS, install_id)
SELECT $ATRANS_COLS_T, '$INSTALL_ID' FROM main.audio_transcriptions t
JOIN main.audio_chunks c ON t.audio_chunk_id = c.id
WHERE date(c.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "audio_tags ($SRC_ATAGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.audio_tags ($ATAGS_COLS, install_id)
SELECT $ATAGS_COLS_AT, '$INSTALL_ID' FROM main.audio_tags at
JOIN main.audio_chunks c ON at.audio_chunk_id = c.id
WHERE date(c.timestamp) = '$TARGET_DATE';
DETACH nas;
"
# ─── SYNC SHARED ──────────────────────────────────────────────────────────
step "Syncing shared tables (tags, vision_tags)"
run_sqlite_heredoc "tags ($SRC_TAGS rows, all)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.tags ($TAGS_COLS, install_id)
SELECT $TAGS_COLS, '$INSTALL_ID' FROM main.tags;
DETACH nas;
"
run_sqlite_heredoc "vision_tags ($SRC_VTAGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.vision_tags ($VTAGS_COLS, install_id)
SELECT $VTAGS_COLS_VT, '$INSTALL_ID' FROM main.vision_tags vt
JOIN main.frames f ON vt.vision_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE (contentless, auto-rowid, no collisions) ──────────────────
# No `rowid` specified; SQLite assigns a fresh one. install_id + source_id
# are UNINDEXED columns so JOIN-back-to-base queries work.
step "Updating FTS indexes"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(full_text, app_name, window_name, browser_url, install_id, source_id)
SELECT full_text, app_name, window_name, browser_url, install_id, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND install_id = '$INSTALL_ID'
AND full_text IS NOT NULL AND full_text != '';
DETACH nas;
"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(text, role, install_id, source_id, frame_id)
SELECT e.text, e.role, e.install_id, e.id, e.frame_id
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id AND e.install_id = f.install_id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.install_id = '$INSTALL_ID'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(text_content, app_name, window_title, element_name, install_id, source_id)
SELECT text_content, app_name, window_title, element_name, install_id, id
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND install_id = '$INSTALL_ID'
AND text_content IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "audio_transcriptions_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.audio_transcriptions_fts(transcription, device, speaker_id, install_id, source_id)
SELECT t.transcription, COALESCE(t.device,''), t.speaker_id, t.install_id, t.id
FROM nas.audio_transcriptions t
JOIN nas.audio_chunks c ON t.audio_chunk_id = c.id AND t.install_id = c.install_id
WHERE date(c.timestamp) = '$TARGET_DATE'
AND t.install_id = '$INSTALL_ID'
AND t.transcription IS NOT NULL AND t.transcription != '';
DETACH nas;
"
# ─── VERIFY ───────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE install_id='$INSTALL_ID' AND frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE install_id='$INSTALL_ID' AND frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_ACHUNKS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_ATRANS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM audio_transcriptions WHERE install_id='$INSTALL_ID' AND audio_chunk_id IN (SELECT id FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_ATAGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM audio_tags WHERE install_id='$INSTALL_ID' AND audio_chunk_id IN (SELECT id FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_VTAGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM vision_tags WHERE install_id='$INSTALL_ID' AND vision_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
check "audio_chunks" "$V_ACHUNKS" "$SRC_ACHUNKS"
check "audio_transcriptions" "$V_ATRANS" "$SRC_ATRANS"
check "audio_tags" "$V_ATAGS" "$SRC_ATAGS"
check "vision_tags" "$V_VTAGS" "$SRC_VTAGS"
fi
# ─── COPY FRAME DATA FOLDER ──────────────────────────────────────────────────
step "Copying frame data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-40s " "rsync frames → NAS"
rsync -a --ignore-existing "$DATA_SRC/" "$NAS_DATA/$TARGET_DATE/" 2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" 2>/dev/null | grep -v '^audio$' | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -ge "$SRC_FILES" ]; then
printf "\r %-40s ✓ %dm%02ds (%s files, %s)\n" \
"rsync frames → NAS" "$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-40s ✗ %s / %s files\n" "rsync frames → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-40s %s\n" "rsync frames → NAS" "skipped (no source dir)"
fi
# ─── COPY AUDIO FILES ────────────────────────────────────────────────────────
# Audio is flat in ~/.screenpipe/data/ with date in filename, e.g.
# System Audio (output)_2026-05-11_13-48-12.mp4
# soundcore AeroClip (input)_2026-05-10_11-10-32.mp4
# Mirror to $NAS_DATA/<date>/audio/ so each day's archive is self-contained.
step "Copying audio files for $TARGET_DATE"
shopt -s nullglob
AUDIO_FILES=( "$HOME/.screenpipe/data/"*_"${TARGET_DATE}"_*.mp4 )
shopt -u nullglob
if [ ${#AUDIO_FILES[@]} -gt 0 ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE/audio"
RSYNC_START=$(date +%s)
printf " %-40s " "rsync audio → NAS"
rsync -a --ignore-existing "${AUDIO_FILES[@]}" "$NAS_DATA/$TARGET_DATE/audio/" 2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_AUDIO=$(ls "$NAS_DATA/$TARGET_DATE/audio" | wc -l | tr -d ' ')
AUDIO_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE/audio" | cut -f1)
printf "\r %-40s ✓ %dm%02ds (%s files, %s)\n" \
"rsync audio → NAS" "$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_AUDIO" "$AUDIO_SIZE" | tee -a "$LOG_FILE"
else
printf " %-40s %s\n" "rsync audio → NAS" "skipped (no audio for date)"
fi
# ─── COPY LOGS ────────────────────────────────────────────────────────────────
step "Copying screenpipe logs for $TARGET_DATE"
NAS_LOGS="$NAS_MOUNT/logs"
mkdir -p "$NAS_LOGS"
shopt -s nullglob
LOG_FILES=( "$HOME/.screenpipe/screenpipe.$TARGET_DATE."*.log )
shopt -u nullglob
if [ ${#LOG_FILES[@]} -gt 0 ]; then
printf " %-40s " "rsync logs → NAS"
rsync -a "${LOG_FILES[@]}" "$NAS_LOGS/" 2>>"$LOG_FILE"
TOTAL_SIZE=$(du -ch "${LOG_FILES[@]}" | tail -1 | cut -f1)
printf "✓ %d file(s), %s\n" "${#LOG_FILES[@]}" "$TOTAL_SIZE" | tee -a "$LOG_FILE"
else
printf " %-40s %s\n" "rsync logs → NAS" "skipped (no matching logs)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE (install $INSTALL_ID)"
log "========================================"
rsync -a "$HOME/.screenpipe/sync.log" "$NAS_LOGS/sync.log" 2>/dev/null || true
Implement and run pipe l…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports - 1 forwarded port
PORTS
1
Remote - SSH - Output...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E) - 1 unsaved file","depth":19,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":22,"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G) - 11 pending changes","depth":19,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":22,"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update, 1 requires restart","depth":19,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":22,"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Containers","depth":19,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Explorer Section: screenpipe [SSH: nas]","depth":21,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: screenpipe [SSH: nas]","depth":22,"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"SCREENPIPE [SSH: NAS]","depth":23,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"#recycle","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"app","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"data","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"logs","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"pipes","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".gitignore","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"app_settings.json","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"archive.db","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"archive.db-bak","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"U","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"archive.db.bak-pre-installid","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite-shm","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"db.sqlite-wal","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe_fts_migrate.sh","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe_sync_updated.sh","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"U","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe_sync.sh","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"M","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"screenpipe.db","depth":27,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"app_settings.json, Editor Group 1","depth":28,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe_sync.sh, Editor Group 1","depth":28,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe_fts_migrate.sh, Editor Group 1","depth":28,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe_sync_updated.sh, preview, Editor Group 1","depth":28,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"pipe.md, Editor Group 1","depth":28,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":".env, Editor Group 1","depth":28,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"done\n\n step \"Reconciling NAS schema with source\"\n for tbl in \"${ALL_SYNC_TABLES[@]}\"; do\n ensure_columns \"$tbl\"\n done\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\n-- vision\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_document_path ON frames(document_path) WHERE document_path IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(install_id, frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(install_id, frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_elements_onscreen_frame ON elements(install_id, frame_id) WHERE on_screen = 1 AND text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(install_id, frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(install_id, frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\n-- audio\nCREATE INDEX IF NOT EXISTS nas.idx_audio_chunks_timestamp ON audio_chunks(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_audio_trans_chunk_id ON audio_transcriptions(install_id, audio_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_audio_trans_timestamp ON audio_transcriptions(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_audio_trans_speaker ON audio_transcriptions(install_id, speaker_id, timestamp DESC);\nCREATE INDEX IF NOT EXISTS nas.idx_speaker_emb_speaker_id ON speaker_embeddings(install_id, speaker_id);\nCREATE INDEX IF NOT EXISTS nas.idx_audio_tags_chunk_id ON audio_tags(install_id, audio_chunk_id);\nDETACH nas;\n\"\n\n # ─── FTS TABLES (contentless, install-safe) ───────────────────────────────\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url,\n install_id UNINDEXED, source_id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role,\n install_id UNINDEXED, source_id UNINDEXED, frame_id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content, app_name, window_title, element_name,\n install_id UNINDEXED, source_id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.audio_transcriptions_fts USING fts5(\n transcription, device,\n speaker_id UNINDEXED, install_id UNINDEXED, source_id UNINDEXED,\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── BUILD COLUMN LISTS ───────────────────────────────────────────────────\n FRAMES_COLS=$(build_col_list frames)\n ELEMENTS_COLS=$(build_col_list elements)\n ELEMENTS_COLS_E=$(build_col_list elements e)\n UI_EVENTS_COLS=$(build_col_list ui_events)\n OCR_TEXT_COLS=$(build_col_list ocr_text)\n OCR_TEXT_COLS_O=$(build_col_list ocr_text o)\n VIDEO_CHUNKS_COLS=$(build_col_list video_chunks)\n MEETINGS_COLS=$(build_col_list meetings)\n ACHUNKS_COLS=$(build_col_list audio_chunks)\n ATRANS_COLS=$(build_col_list audio_transcriptions)\n ATRANS_COLS_T=$(build_col_list audio_transcriptions t)\n SPEAKERS_COLS=$(build_col_list speakers)\n SEMB_COLS=$(build_col_list speaker_embeddings)\n ATAGS_COLS=$(build_col_list audio_tags)\n ATAGS_COLS_AT=$(build_col_list audio_tags at)\n TAGS_COLS=$(build_col_list tags)\n VTAGS_COLS=$(build_col_list vision_tags)\n VTAGS_COLS_VT=$(build_col_list vision_tags vt)\n\n # ─── SYNC VISION DATA ─────────────────────────────────────────────────────\n step \"Syncing vision data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks ($VIDEO_CHUNKS_COLS, install_id)\n SELECT $VIDEO_CHUNKS_COLS, '$INSTALL_ID' FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames ($FRAMES_COLS, install_id)\n SELECT $FRAMES_COLS, '$INSTALL_ID' FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text ($OCR_TEXT_COLS, install_id)\n SELECT $OCR_TEXT_COLS_O, '$INSTALL_ID' FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events ($UI_EVENTS_COLS, install_id)\n SELECT $UI_EVENTS_COLS, '$INSTALL_ID' FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements ($ELEMENTS_COLS, install_id)\n SELECT $ELEMENTS_COLS_E, '$INSTALL_ID' FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings ($MEETINGS_COLS, install_id)\n SELECT $MEETINGS_COLS, '$INSTALL_ID' FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── SYNC AUDIO DATA ──────────────────────────────────────────────────────\n step \"Syncing audio data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"speakers ($SRC_SPEAKERS rows, all)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.speakers ($SPEAKERS_COLS, install_id)\n SELECT $SPEAKERS_COLS, '$INSTALL_ID' FROM main.speakers;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"speaker_embeddings ($SRC_SEMB rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.speaker_embeddings ($SEMB_COLS, install_id)\n SELECT $SEMB_COLS, '$INSTALL_ID' FROM main.speaker_embeddings;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"audio_chunks ($SRC_ACHUNKS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.audio_chunks ($ACHUNKS_COLS, install_id)\n SELECT $ACHUNKS_COLS, '$INSTALL_ID' FROM main.audio_chunks WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"audio_transcriptions ($SRC_ATRANS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.audio_transcriptions ($ATRANS_COLS, install_id)\n SELECT $ATRANS_COLS_T, '$INSTALL_ID' FROM main.audio_transcriptions t\n JOIN main.audio_chunks c ON t.audio_chunk_id = c.id\n WHERE date(c.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"audio_tags ($SRC_ATAGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.audio_tags ($ATAGS_COLS, install_id)\n SELECT $ATAGS_COLS_AT, '$INSTALL_ID' FROM main.audio_tags at\n JOIN main.audio_chunks c ON at.audio_chunk_id = c.id\n WHERE date(c.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── SYNC SHARED ──────────────────────────────────────────────────────────\n step \"Syncing shared tables (tags, vision_tags)\"\n\n run_sqlite_heredoc \"tags ($SRC_TAGS rows, all)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.tags ($TAGS_COLS, install_id)\n SELECT $TAGS_COLS, '$INSTALL_ID' FROM main.tags;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"vision_tags ($SRC_VTAGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.vision_tags ($VTAGS_COLS, install_id)\n SELECT $VTAGS_COLS_VT, '$INSTALL_ID' FROM main.vision_tags vt\n JOIN main.frames f ON vt.vision_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE (contentless, auto-rowid, no collisions) ──────────────────\n # No `rowid` specified; SQLite assigns a fresh one. install_id + source_id\n # are UNINDEXED columns so JOIN-back-to-base queries work.\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(full_text, app_name, window_name, browser_url, install_id, source_id)\n SELECT full_text, app_name, window_name, browser_url, install_id, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND install_id = '$INSTALL_ID'\n AND full_text IS NOT NULL AND full_text != '';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(text, role, install_id, source_id, frame_id)\n SELECT e.text, e.role, e.install_id, e.id, e.frame_id\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id AND e.install_id = f.install_id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.install_id = '$INSTALL_ID'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(text_content, app_name, window_title, element_name, install_id, source_id)\n SELECT text_content, app_name, window_title, element_name, install_id, id\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND install_id = '$INSTALL_ID'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"audio_transcriptions_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.audio_transcriptions_fts(transcription, device, speaker_id, install_id, source_id)\n SELECT t.transcription, COALESCE(t.device,''), t.speaker_id, t.install_id, t.id\n FROM nas.audio_transcriptions t\n JOIN nas.audio_chunks c ON t.audio_chunk_id = c.id AND t.install_id = c.install_id\n WHERE date(c.timestamp) = '$TARGET_DATE'\n AND t.install_id = '$INSTALL_ID'\n AND t.transcription IS NOT NULL AND t.transcription != '';\nDETACH nas;\n\"\n\n # ─── VERIFY ───────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE install_id='$INSTALL_ID' AND frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE install_id='$INSTALL_ID' AND frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE' AND install_id='$INSTALL_ID';\")\n V_ACHUNKS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';\")\n V_ATRANS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM audio_transcriptions WHERE install_id='$INSTALL_ID' AND audio_chunk_id IN (SELECT id FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n V_ATAGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM audio_tags WHERE install_id='$INSTALL_ID' AND audio_chunk_id IN (SELECT id FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n V_VTAGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM vision_tags WHERE install_id='$INSTALL_ID' AND vision_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n check \"audio_chunks\" \"$V_ACHUNKS\" \"$SRC_ACHUNKS\"\n check \"audio_transcriptions\" \"$V_ATRANS\" \"$SRC_ATRANS\"\n check \"audio_tags\" \"$V_ATAGS\" \"$SRC_ATAGS\"\n check \"vision_tags\" \"$V_VTAGS\" \"$SRC_VTAGS\"\n\nfi\n\n# ─── COPY FRAME DATA FOLDER ──────────────────────────────────────────────────\nstep \"Copying frame data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-40s \" \"rsync frames → NAS\"\n rsync -a --ignore-existing \"$DATA_SRC/\" \"$NAS_DATA/$TARGET_DATE/\" 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" 2>/dev/null | grep -v '^audio$' | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -ge \"$SRC_FILES\" ]; then\n printf \"\\r %-40s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync frames → NAS\" \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-40s ✗ %s / %s files\\n\" \"rsync frames → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-40s %s\\n\" \"rsync frames → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── COPY AUDIO FILES ────────────────────────────────────────────────────────\n# Audio is flat in ~/.screenpipe/data/ with date in filename, e.g.\n# System Audio (output)_2026-05-11_13-48-12.mp4\n# soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n# Mirror to $NAS_DATA/<date>/audio/ so each day's archive is self-contained.\nstep \"Copying audio files for $TARGET_DATE\"\n\nshopt -s nullglob\nAUDIO_FILES=( \"$HOME/.screenpipe/data/\"*_\"${TARGET_DATE}\"_*.mp4 )\nshopt -u nullglob\n\nif [ ${#AUDIO_FILES[@]} -gt 0 ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE/audio\"\n RSYNC_START=$(date +%s)\n printf \" %-40s \" \"rsync audio → NAS\"\n rsync -a --ignore-existing \"${AUDIO_FILES[@]}\" \"$NAS_DATA/$TARGET_DATE/audio/\" 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_AUDIO=$(ls \"$NAS_DATA/$TARGET_DATE/audio\" | wc -l | tr -d ' ')\n AUDIO_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE/audio\" | cut -f1)\n printf \"\\r %-40s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync audio → NAS\" \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_AUDIO\" \"$AUDIO_SIZE\" | tee -a \"$LOG_FILE\"\nelse\n printf \" %-40s %s\\n\" \"rsync audio → NAS\" \"skipped (no audio for date)\"\nfi\n\n# ─── COPY LOGS ────────────────────────────────────────────────────────────────\nstep \"Copying screenpipe logs for $TARGET_DATE\"\n\nNAS_LOGS=\"$NAS_MOUNT/logs\"\nmkdir -p \"$NAS_LOGS\"\n\nshopt -s nullglob\nLOG_FILES=( \"$HOME/.screenpipe/screenpipe.$TARGET_DATE.\"*.log )\nshopt -u nullglob\n\nif [ ${#LOG_FILES[@]} -gt 0 ]; then\n printf \" %-40s \" \"rsync logs → NAS\"\n rsync -a \"${LOG_FILES[@]}\" \"$NAS_LOGS/\" 2>>\"$LOG_FILE\"\n TOTAL_SIZE=$(du -ch \"${LOG_FILES[@]}\" | tail -1 | cut -f1)\n printf \"✓ %d file(s), %s\\n\" \"${#LOG_FILES[@]}\" \"$TOTAL_SIZE\" | tee -a \"$LOG_FILE\"\nelse\n printf \" %-40s %s\\n\" \"rsync logs → NAS\" \"skipped (no matching logs)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE (install $INSTALL_ID)\"\nlog \"========================================\"\n\nrsync -a \"$HOME/.screenpipe/sync.log\" \"$NAS_LOGS/sync.log\" 2>/dev/null || true","depth":28,"on_screen":true,"value":"done\n\n step \"Reconciling NAS schema with source\"\n for tbl in \"${ALL_SYNC_TABLES[@]}\"; do\n ensure_columns \"$tbl\"\n done\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\n-- vision\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_document_path ON frames(document_path) WHERE document_path IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(install_id, frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(install_id, frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_elements_onscreen_frame ON elements(install_id, frame_id) WHERE on_screen = 1 AND text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(install_id, frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(install_id, frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\n-- audio\nCREATE INDEX IF NOT EXISTS nas.idx_audio_chunks_timestamp ON audio_chunks(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_audio_trans_chunk_id ON audio_transcriptions(install_id, audio_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_audio_trans_timestamp ON audio_transcriptions(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_audio_trans_speaker ON audio_transcriptions(install_id, speaker_id, timestamp DESC);\nCREATE INDEX IF NOT EXISTS nas.idx_speaker_emb_speaker_id ON speaker_embeddings(install_id, speaker_id);\nCREATE INDEX IF NOT EXISTS nas.idx_audio_tags_chunk_id ON audio_tags(install_id, audio_chunk_id);\nDETACH nas;\n\"\n\n # ─── FTS TABLES (contentless, install-safe) ───────────────────────────────\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url,\n install_id UNINDEXED, source_id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role,\n install_id UNINDEXED, source_id UNINDEXED, frame_id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content, app_name, window_title, element_name,\n install_id UNINDEXED, source_id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.audio_transcriptions_fts USING fts5(\n transcription, device,\n speaker_id UNINDEXED, install_id UNINDEXED, source_id UNINDEXED,\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── BUILD COLUMN LISTS ───────────────────────────────────────────────────\n FRAMES_COLS=$(build_col_list frames)\n ELEMENTS_COLS=$(build_col_list elements)\n ELEMENTS_COLS_E=$(build_col_list elements e)\n UI_EVENTS_COLS=$(build_col_list ui_events)\n OCR_TEXT_COLS=$(build_col_list ocr_text)\n OCR_TEXT_COLS_O=$(build_col_list ocr_text o)\n VIDEO_CHUNKS_COLS=$(build_col_list video_chunks)\n MEETINGS_COLS=$(build_col_list meetings)\n ACHUNKS_COLS=$(build_col_list audio_chunks)\n ATRANS_COLS=$(build_col_list audio_transcriptions)\n ATRANS_COLS_T=$(build_col_list audio_transcriptions t)\n SPEAKERS_COLS=$(build_col_list speakers)\n SEMB_COLS=$(build_col_list speaker_embeddings)\n ATAGS_COLS=$(build_col_list audio_tags)\n ATAGS_COLS_AT=$(build_col_list audio_tags at)\n TAGS_COLS=$(build_col_list tags)\n VTAGS_COLS=$(build_col_list vision_tags)\n VTAGS_COLS_VT=$(build_col_list vision_tags vt)\n\n # ─── SYNC VISION DATA ─────────────────────────────────────────────────────\n step \"Syncing vision data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks ($VIDEO_CHUNKS_COLS, install_id)\n SELECT $VIDEO_CHUNKS_COLS, '$INSTALL_ID' FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames ($FRAMES_COLS, install_id)\n SELECT $FRAMES_COLS, '$INSTALL_ID' FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text ($OCR_TEXT_COLS, install_id)\n SELECT $OCR_TEXT_COLS_O, '$INSTALL_ID' FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events ($UI_EVENTS_COLS, install_id)\n SELECT $UI_EVENTS_COLS, '$INSTALL_ID' FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements ($ELEMENTS_COLS, install_id)\n SELECT $ELEMENTS_COLS_E, '$INSTALL_ID' FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings ($MEETINGS_COLS, install_id)\n SELECT $MEETINGS_COLS, '$INSTALL_ID' FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── SYNC AUDIO DATA ──────────────────────────────────────────────────────\n step \"Syncing audio data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"speakers ($SRC_SPEAKERS rows, all)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.speakers ($SPEAKERS_COLS, install_id)\n SELECT $SPEAKERS_COLS, '$INSTALL_ID' FROM main.speakers;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"speaker_embeddings ($SRC_SEMB rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.speaker_embeddings ($SEMB_COLS, install_id)\n SELECT $SEMB_COLS, '$INSTALL_ID' FROM main.speaker_embeddings;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"audio_chunks ($SRC_ACHUNKS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.audio_chunks ($ACHUNKS_COLS, install_id)\n SELECT $ACHUNKS_COLS, '$INSTALL_ID' FROM main.audio_chunks WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"audio_transcriptions ($SRC_ATRANS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.audio_transcriptions ($ATRANS_COLS, install_id)\n SELECT $ATRANS_COLS_T, '$INSTALL_ID' FROM main.audio_transcriptions t\n JOIN main.audio_chunks c ON t.audio_chunk_id = c.id\n WHERE date(c.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"audio_tags ($SRC_ATAGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.audio_tags ($ATAGS_COLS, install_id)\n SELECT $ATAGS_COLS_AT, '$INSTALL_ID' FROM main.audio_tags at\n JOIN main.audio_chunks c ON at.audio_chunk_id = c.id\n WHERE date(c.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── SYNC SHARED ──────────────────────────────────────────────────────────\n step \"Syncing shared tables (tags, vision_tags)\"\n\n run_sqlite_heredoc \"tags ($SRC_TAGS rows, all)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.tags ($TAGS_COLS, install_id)\n SELECT $TAGS_COLS, '$INSTALL_ID' FROM main.tags;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"vision_tags ($SRC_VTAGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.vision_tags ($VTAGS_COLS, install_id)\n SELECT $VTAGS_COLS_VT, '$INSTALL_ID' FROM main.vision_tags vt\n JOIN main.frames f ON vt.vision_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE (contentless, auto-rowid, no collisions) ──────────────────\n # No `rowid` specified; SQLite assigns a fresh one. install_id + source_id\n # are UNINDEXED columns so JOIN-back-to-base queries work.\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(full_text, app_name, window_name, browser_url, install_id, source_id)\n SELECT full_text, app_name, window_name, browser_url, install_id, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND install_id = '$INSTALL_ID'\n AND full_text IS NOT NULL AND full_text != '';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(text, role, install_id, source_id, frame_id)\n SELECT e.text, e.role, e.install_id, e.id, e.frame_id\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id AND e.install_id = f.install_id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.install_id = '$INSTALL_ID'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(text_content, app_name, window_title, element_name, install_id, source_id)\n SELECT text_content, app_name, window_title, element_name, install_id, id\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND install_id = '$INSTALL_ID'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"audio_transcriptions_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.audio_transcriptions_fts(transcription, device, speaker_id, install_id, source_id)\n SELECT t.transcription, COALESCE(t.device,''), t.speaker_id, t.install_id, t.id\n FROM nas.audio_transcriptions t\n JOIN nas.audio_chunks c ON t.audio_chunk_id = c.id AND t.install_id = c.install_id\n WHERE date(c.timestamp) = '$TARGET_DATE'\n AND t.install_id = '$INSTALL_ID'\n AND t.transcription IS NOT NULL AND t.transcription != '';\nDETACH nas;\n\"\n\n # ─── VERIFY ───────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE install_id='$INSTALL_ID' AND frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE install_id='$INSTALL_ID' AND frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE' AND install_id='$INSTALL_ID';\")\n V_ACHUNKS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';\")\n V_ATRANS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM audio_transcriptions WHERE install_id='$INSTALL_ID' AND audio_chunk_id IN (SELECT id FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n V_ATAGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM audio_tags WHERE install_id='$INSTALL_ID' AND audio_chunk_id IN (SELECT id FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n V_VTAGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM vision_tags WHERE install_id='$INSTALL_ID' AND vision_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n check \"audio_chunks\" \"$V_ACHUNKS\" \"$SRC_ACHUNKS\"\n check \"audio_transcriptions\" \"$V_ATRANS\" \"$SRC_ATRANS\"\n check \"audio_tags\" \"$V_ATAGS\" \"$SRC_ATAGS\"\n check \"vision_tags\" \"$V_VTAGS\" \"$SRC_VTAGS\"\n\nfi\n\n# ─── COPY FRAME DATA FOLDER ──────────────────────────────────────────────────\nstep \"Copying frame data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-40s \" \"rsync frames → NAS\"\n rsync -a --ignore-existing \"$DATA_SRC/\" \"$NAS_DATA/$TARGET_DATE/\" 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" 2>/dev/null | grep -v '^audio$' | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -ge \"$SRC_FILES\" ]; then\n printf \"\\r %-40s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync frames → NAS\" \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-40s ✗ %s / %s files\\n\" \"rsync frames → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-40s %s\\n\" \"rsync frames → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── COPY AUDIO FILES ────────────────────────────────────────────────────────\n# Audio is flat in ~/.screenpipe/data/ with date in filename, e.g.\n# System Audio (output)_2026-05-11_13-48-12.mp4\n# soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n# Mirror to $NAS_DATA/<date>/audio/ so each day's archive is self-contained.\nstep \"Copying audio files for $TARGET_DATE\"\n\nshopt -s nullglob\nAUDIO_FILES=( \"$HOME/.screenpipe/data/\"*_\"${TARGET_DATE}\"_*.mp4 )\nshopt -u nullglob\n\nif [ ${#AUDIO_FILES[@]} -gt 0 ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE/audio\"\n RSYNC_START=$(date +%s)\n printf \" %-40s \" \"rsync audio → NAS\"\n rsync -a --ignore-existing \"${AUDIO_FILES[@]}\" \"$NAS_DATA/$TARGET_DATE/audio/\" 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_AUDIO=$(ls \"$NAS_DATA/$TARGET_DATE/audio\" | wc -l | tr -d ' ')\n AUDIO_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE/audio\" | cut -f1)\n printf \"\\r %-40s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync audio → NAS\" \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_AUDIO\" \"$AUDIO_SIZE\" | tee -a \"$LOG_FILE\"\nelse\n printf \" %-40s %s\\n\" \"rsync audio → NAS\" \"skipped (no audio for date)\"\nfi\n\n# ─── COPY LOGS ────────────────────────────────────────────────────────────────\nstep \"Copying screenpipe logs for $TARGET_DATE\"\n\nNAS_LOGS=\"$NAS_MOUNT/logs\"\nmkdir -p \"$NAS_LOGS\"\n\nshopt -s nullglob\nLOG_FILES=( \"$HOME/.screenpipe/screenpipe.$TARGET_DATE.\"*.log )\nshopt -u nullglob\n\nif [ ${#LOG_FILES[@]} -gt 0 ]; then\n printf \" %-40s \" \"rsync logs → NAS\"\n rsync -a \"${LOG_FILES[@]}\" \"$NAS_LOGS/\" 2>>\"$LOG_FILE\"\n TOTAL_SIZE=$(du -ch \"${LOG_FILES[@]}\" | tail -1 | cut -f1)\n printf \"✓ %d file(s), %s\\n\" \"${#LOG_FILES[@]}\" \"$TOTAL_SIZE\" | tee -a \"$LOG_FILE\"\nelse\n printf \" %-40s %s\\n\" \"rsync logs → NAS\" \"skipped (no matching logs)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE (install $INSTALL_ID)\"\nlog \"========================================\"\n\nrsync -a \"$HOME/.screenpipe/sync.log\" \"$NAS_LOGS/sync.log\" 2>/dev/null || true","role_description":"editor","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"done\n\n step \"Reconciling NAS schema with source\"\n for tbl in \"${ALL_SYNC_TABLES[@]}\"; do\n ensure_columns \"$tbl\"\n done\n\n run_sqlite_heredoc \"creating indexes\" \"\nATTACH '$NAS_DB' AS nas;\n-- vision\nCREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_frames_document_path ON frames(document_path) WHERE document_path IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(install_id, frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(install_id, frame_id, source, role) WHERE text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_elements_onscreen_frame ON elements(install_id, frame_id) WHERE on_screen = 1 AND text IS NOT NULL;\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);\nCREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(install_id, frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(install_id, frame_id);\nCREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);\nCREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);\n-- audio\nCREATE INDEX IF NOT EXISTS nas.idx_audio_chunks_timestamp ON audio_chunks(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_audio_trans_chunk_id ON audio_transcriptions(install_id, audio_chunk_id);\nCREATE INDEX IF NOT EXISTS nas.idx_audio_trans_timestamp ON audio_transcriptions(timestamp);\nCREATE INDEX IF NOT EXISTS nas.idx_audio_trans_speaker ON audio_transcriptions(install_id, speaker_id, timestamp DESC);\nCREATE INDEX IF NOT EXISTS nas.idx_speaker_emb_speaker_id ON speaker_embeddings(install_id, speaker_id);\nCREATE INDEX IF NOT EXISTS nas.idx_audio_tags_chunk_id ON audio_tags(install_id, audio_chunk_id);\nDETACH nas;\n\"\n\n # ─── FTS TABLES (contentless, install-safe) ───────────────────────────────\n run_sqlite_heredoc \"creating FTS tables\" \"\nATTACH '$NAS_DB' AS nas;\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(\n full_text, app_name, window_name, browser_url,\n install_id UNINDEXED, source_id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(\n text, role,\n install_id UNINDEXED, source_id UNINDEXED, frame_id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(\n text_content, app_name, window_title, element_name,\n install_id UNINDEXED, source_id UNINDEXED,\n tokenize='unicode61'\n);\nCREATE VIRTUAL TABLE IF NOT EXISTS nas.audio_transcriptions_fts USING fts5(\n transcription, device,\n speaker_id UNINDEXED, install_id UNINDEXED, source_id UNINDEXED,\n tokenize='unicode61'\n);\nDETACH nas;\n\"\n\n # ─── BUILD COLUMN LISTS ───────────────────────────────────────────────────\n FRAMES_COLS=$(build_col_list frames)\n ELEMENTS_COLS=$(build_col_list elements)\n ELEMENTS_COLS_E=$(build_col_list elements e)\n UI_EVENTS_COLS=$(build_col_list ui_events)\n OCR_TEXT_COLS=$(build_col_list ocr_text)\n OCR_TEXT_COLS_O=$(build_col_list ocr_text o)\n VIDEO_CHUNKS_COLS=$(build_col_list video_chunks)\n MEETINGS_COLS=$(build_col_list meetings)\n ACHUNKS_COLS=$(build_col_list audio_chunks)\n ATRANS_COLS=$(build_col_list audio_transcriptions)\n ATRANS_COLS_T=$(build_col_list audio_transcriptions t)\n SPEAKERS_COLS=$(build_col_list speakers)\n SEMB_COLS=$(build_col_list speaker_embeddings)\n ATAGS_COLS=$(build_col_list audio_tags)\n ATAGS_COLS_AT=$(build_col_list audio_tags at)\n TAGS_COLS=$(build_col_list tags)\n VTAGS_COLS=$(build_col_list vision_tags)\n VTAGS_COLS_VT=$(build_col_list vision_tags vt)\n\n # ─── SYNC VISION DATA ─────────────────────────────────────────────────────\n step \"Syncing vision data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"video_chunks\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.video_chunks ($VIDEO_CHUNKS_COLS, install_id)\n SELECT $VIDEO_CHUNKS_COLS, '$INSTALL_ID' FROM main.video_chunks\n WHERE id IN (\n SELECT DISTINCT video_chunk_id FROM main.frames\n WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL\n );\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"frames ($SRC_FRAMES rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.frames ($FRAMES_COLS, install_id)\n SELECT $FRAMES_COLS, '$INSTALL_ID' FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ocr_text ($SRC_OCR rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ocr_text ($OCR_TEXT_COLS, install_id)\n SELECT $OCR_TEXT_COLS_O, '$INSTALL_ID' FROM main.ocr_text o\n JOIN main.frames f ON o.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events ($SRC_UI rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.ui_events ($UI_EVENTS_COLS, install_id)\n SELECT $UI_EVENTS_COLS, '$INSTALL_ID' FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements ($SRC_ELEMENTS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.elements ($ELEMENTS_COLS, install_id)\n SELECT $ELEMENTS_COLS_E, '$INSTALL_ID' FROM main.elements e\n JOIN main.frames f ON e.frame_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"meetings ($SRC_MEETINGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.meetings ($MEETINGS_COLS, install_id)\n SELECT $MEETINGS_COLS, '$INSTALL_ID' FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── SYNC AUDIO DATA ──────────────────────────────────────────────────────\n step \"Syncing audio data for $TARGET_DATE\"\n\n run_sqlite_heredoc \"speakers ($SRC_SPEAKERS rows, all)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.speakers ($SPEAKERS_COLS, install_id)\n SELECT $SPEAKERS_COLS, '$INSTALL_ID' FROM main.speakers;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"speaker_embeddings ($SRC_SEMB rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.speaker_embeddings ($SEMB_COLS, install_id)\n SELECT $SEMB_COLS, '$INSTALL_ID' FROM main.speaker_embeddings;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"audio_chunks ($SRC_ACHUNKS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.audio_chunks ($ACHUNKS_COLS, install_id)\n SELECT $ACHUNKS_COLS, '$INSTALL_ID' FROM main.audio_chunks WHERE date(timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"audio_transcriptions ($SRC_ATRANS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.audio_transcriptions ($ATRANS_COLS, install_id)\n SELECT $ATRANS_COLS_T, '$INSTALL_ID' FROM main.audio_transcriptions t\n JOIN main.audio_chunks c ON t.audio_chunk_id = c.id\n WHERE date(c.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"audio_tags ($SRC_ATAGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.audio_tags ($ATAGS_COLS, install_id)\n SELECT $ATAGS_COLS_AT, '$INSTALL_ID' FROM main.audio_tags at\n JOIN main.audio_chunks c ON at.audio_chunk_id = c.id\n WHERE date(c.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── SYNC SHARED ──────────────────────────────────────────────────────────\n step \"Syncing shared tables (tags, vision_tags)\"\n\n run_sqlite_heredoc \"tags ($SRC_TAGS rows, all)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.tags ($TAGS_COLS, install_id)\n SELECT $TAGS_COLS, '$INSTALL_ID' FROM main.tags;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"vision_tags ($SRC_VTAGS rows)\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT OR IGNORE INTO nas.vision_tags ($VTAGS_COLS, install_id)\n SELECT $VTAGS_COLS_VT, '$INSTALL_ID' FROM main.vision_tags vt\n JOIN main.frames f ON vt.vision_id = f.id\n WHERE date(f.timestamp) = '$TARGET_DATE';\nDETACH nas;\n\"\n\n # ─── FTS UPDATE (contentless, auto-rowid, no collisions) ──────────────────\n # No `rowid` specified; SQLite assigns a fresh one. install_id + source_id\n # are UNINDEXED columns so JOIN-back-to-base queries work.\n step \"Updating FTS indexes\"\n\n run_sqlite_heredoc \"frames_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.frames_fts(full_text, app_name, window_name, browser_url, install_id, source_id)\n SELECT full_text, app_name, window_name, browser_url, install_id, id\n FROM nas.frames\n WHERE date(timestamp) = '$TARGET_DATE'\n AND install_id = '$INSTALL_ID'\n AND full_text IS NOT NULL AND full_text != '';\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"elements_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.elements_fts(text, role, install_id, source_id, frame_id)\n SELECT e.text, e.role, e.install_id, e.id, e.frame_id\n FROM nas.elements e\n JOIN nas.frames f ON e.frame_id = f.id AND e.install_id = f.install_id\n WHERE date(f.timestamp) = '$TARGET_DATE'\n AND e.install_id = '$INSTALL_ID'\n AND e.text IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"ui_events_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.ui_events_fts(text_content, app_name, window_title, element_name, install_id, source_id)\n SELECT text_content, app_name, window_title, element_name, install_id, id\n FROM nas.ui_events\n WHERE date(timestamp) = '$TARGET_DATE'\n AND install_id = '$INSTALL_ID'\n AND text_content IS NOT NULL;\nDETACH nas;\n\"\n\n run_sqlite_heredoc \"audio_transcriptions_fts\" \"\nATTACH '$NAS_DB' AS nas;\nINSERT INTO nas.audio_transcriptions_fts(transcription, device, speaker_id, install_id, source_id)\n SELECT t.transcription, COALESCE(t.device,''), t.speaker_id, t.install_id, t.id\n FROM nas.audio_transcriptions t\n JOIN nas.audio_chunks c ON t.audio_chunk_id = c.id AND t.install_id = c.install_id\n WHERE date(c.timestamp) = '$TARGET_DATE'\n AND t.install_id = '$INSTALL_ID'\n AND t.transcription IS NOT NULL AND t.transcription != '';\nDETACH nas;\n\"\n\n # ─── VERIFY ───────────────────────────────────────────────────────────────\n step \"Verifying DB\"\n\n V_FRAMES=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';\")\n V_ELEMENTS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM elements WHERE install_id='$INSTALL_ID' AND frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n V_UI=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';\")\n V_OCR=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM ocr_text WHERE install_id='$INSTALL_ID' AND frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n V_MEETINGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE' AND install_id='$INSTALL_ID';\")\n V_ACHUNKS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';\")\n V_ATRANS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM audio_transcriptions WHERE install_id='$INSTALL_ID' AND audio_chunk_id IN (SELECT id FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n V_ATAGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM audio_tags WHERE install_id='$INSTALL_ID' AND audio_chunk_id IN (SELECT id FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n V_VTAGS=$(sqlite3 \"$NAS_DB\" \"SELECT COUNT(*) FROM vision_tags WHERE install_id='$INSTALL_ID' AND vision_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');\")\n\n check \"frames\" \"$V_FRAMES\" \"$SRC_FRAMES\"\n check \"elements\" \"$V_ELEMENTS\" \"$SRC_ELEMENTS\"\n check \"ui_events\" \"$V_UI\" \"$SRC_UI\"\n check \"ocr_text\" \"$V_OCR\" \"$SRC_OCR\"\n check \"meetings\" \"$V_MEETINGS\" \"$SRC_MEETINGS\"\n check \"audio_chunks\" \"$V_ACHUNKS\" \"$SRC_ACHUNKS\"\n check \"audio_transcriptions\" \"$V_ATRANS\" \"$SRC_ATRANS\"\n check \"audio_tags\" \"$V_ATAGS\" \"$SRC_ATAGS\"\n check \"vision_tags\" \"$V_VTAGS\" \"$SRC_VTAGS\"\n\nfi\n\n# ─── COPY FRAME DATA FOLDER ──────────────────────────────────────────────────\nstep \"Copying frame data folder for $TARGET_DATE\"\n\nif [ -d \"$DATA_SRC\" ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE\"\n RSYNC_START=$(date +%s)\n printf \" %-40s \" \"rsync frames → NAS\"\n rsync -a --ignore-existing \"$DATA_SRC/\" \"$NAS_DATA/$TARGET_DATE/\" 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_FILES=$(ls \"$NAS_DATA/$TARGET_DATE\" 2>/dev/null | grep -v '^audio$' | wc -l | tr -d ' ')\n SRC_FILES=$(ls \"$DATA_SRC\" | wc -l | tr -d ' ')\n COPIED_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE\" | cut -f1)\n if [ \"$COPIED_FILES\" -ge \"$SRC_FILES\" ]; then\n printf \"\\r %-40s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync frames → NAS\" \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_FILES\" \"$COPIED_SIZE\" | tee -a \"$LOG_FILE\"\n else\n printf \"\\r %-40s ✗ %s / %s files\\n\" \"rsync frames → NAS\" \"$COPIED_FILES\" \"$SRC_FILES\" | tee -a \"$LOG_FILE\"\n fi\nelse\n printf \" %-40s %s\\n\" \"rsync frames → NAS\" \"skipped (no source dir)\"\nfi\n\n# ─── COPY AUDIO FILES ────────────────────────────────────────────────────────\n# Audio is flat in ~/.screenpipe/data/ with date in filename, e.g.\n# System Audio (output)_2026-05-11_13-48-12.mp4\n# soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n# Mirror to $NAS_DATA/<date>/audio/ so each day's archive is self-contained.\nstep \"Copying audio files for $TARGET_DATE\"\n\nshopt -s nullglob\nAUDIO_FILES=( \"$HOME/.screenpipe/data/\"*_\"${TARGET_DATE}\"_*.mp4 )\nshopt -u nullglob\n\nif [ ${#AUDIO_FILES[@]} -gt 0 ]; then\n mkdir -p \"$NAS_DATA/$TARGET_DATE/audio\"\n RSYNC_START=$(date +%s)\n printf \" %-40s \" \"rsync audio → NAS\"\n rsync -a --ignore-existing \"${AUDIO_FILES[@]}\" \"$NAS_DATA/$TARGET_DATE/audio/\" 2>>\"$LOG_FILE\"\n RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))\n COPIED_AUDIO=$(ls \"$NAS_DATA/$TARGET_DATE/audio\" | wc -l | tr -d ' ')\n AUDIO_SIZE=$(du -sh \"$NAS_DATA/$TARGET_DATE/audio\" | cut -f1)\n printf \"\\r %-40s ✓ %dm%02ds (%s files, %s)\\n\" \\\n \"rsync audio → NAS\" \"$(( RSYNC_DUR / 60 ))\" \"$(( RSYNC_DUR % 60 ))\" \\\n \"$COPIED_AUDIO\" \"$AUDIO_SIZE\" | tee -a \"$LOG_FILE\"\nelse\n printf \" %-40s %s\\n\" \"rsync audio → NAS\" \"skipped (no audio for date)\"\nfi\n\n# ─── COPY LOGS ────────────────────────────────────────────────────────────────\nstep \"Copying screenpipe logs for $TARGET_DATE\"\n\nNAS_LOGS=\"$NAS_MOUNT/logs\"\nmkdir -p \"$NAS_LOGS\"\n\nshopt -s nullglob\nLOG_FILES=( \"$HOME/.screenpipe/screenpipe.$TARGET_DATE.\"*.log )\nshopt -u nullglob\n\nif [ ${#LOG_FILES[@]} -gt 0 ]; then\n printf \" %-40s \" \"rsync logs → NAS\"\n rsync -a \"${LOG_FILES[@]}\" \"$NAS_LOGS/\" 2>>\"$LOG_FILE\"\n TOTAL_SIZE=$(du -ch \"${LOG_FILES[@]}\" | tail -1 | cut -f1)\n printf \"✓ %d file(s), %s\\n\" \"${#LOG_FILES[@]}\" \"$TOTAL_SIZE\" | tee -a \"$LOG_FILE\"\nelse\n printf \" %-40s %s\\n\" \"rsync logs → NAS\" \"skipped (no matching logs)\"\nfi\n\n# ─── SUMMARY ──────────────────────────────────────────────────────────────────\nTOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))\nDB_SIZE=$(du -sh \"$NAS_DB\" | cut -f1)\n\necho \"\"\nlog \"Archive DB size: $DB_SIZE\"\nlog \"Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s\"\nlog \"Sync complete for $TARGET_DATE (install $INSTALL_ID)\"\nlog \"========================================\"\n\nrsync -a \"$HOME/.screenpipe/sync.log\" \"$NAS_LOGS/sync.log\" 2>/dev/null || true","depth":29,"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Implement and run pipe l…, Editor Group 2","depth":28,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"Problems (⇧⌘M)","depth":22,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PROBLEMS","depth":24,"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Output (⇧⌘U)","depth":22,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"OUTPUT","depth":24,"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Debug Console (⇧⌘Y)","depth":22,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DEBUG CONSOLE","depth":24,"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Terminal (⌃`)","depth":22,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"TERMINAL","depth":24,"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Ports - 1 forwarded port","depth":22,"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PORTS","depth":24,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":25,"on_screen":true,"role_description":"text"},{"role":"AXTextArea","text":"Remote - SSH - Output","depth":27,"on_screen":true,"role_description":"editor"}]...
|
-8014398207710573142
|
3474656469312505749
|
click
|
accessibility
|
NULL
|
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Explorer (⇧⌘E) - 1 unsaved file
1
Search (⇧⌘F)
Source Control (⌃⇧G) - 11 pending changes
11
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update, 1 requires restart
3
Claude Code
Containers
EXPLORER
EXPLORER
Explorer Section: screenpipe [SSH: nas]
Explorer Section: screenpipe [SSH: nas]
SCREENPIPE [SSH: NAS]
#recycle
app
data
logs
pipes
.gitignore
app_settings.json
archive.db
archive.db-bak
U
archive.db.bak-pre-installid
db.sqlite
db.sqlite-shm
db.sqlite-wal
screenpipe_fts_migrate.sh
screenpipe_sync_updated.sh
U
screenpipe_sync.sh
M
screenpipe.db
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
app_settings.json, Editor Group 1
screenpipe_sync.sh, Editor Group 1
screenpipe_fts_migrate.sh, Editor Group 1
screenpipe_sync_updated.sh, preview, Editor Group 1
pipe.md, Editor Group 1
.env, Editor Group 1
done
step "Reconciling NAS schema with source"
for tbl in "${ALL_SYNC_TABLES[@]}"; do
ensure_columns "$tbl"
done
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
-- vision
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_frames_document_path ON frames(document_path) WHERE document_path IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(install_id, frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(install_id, frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_elements_onscreen_frame ON elements(install_id, frame_id) WHERE on_screen = 1 AND text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(install_id, frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(install_id, frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
-- audio
CREATE INDEX IF NOT EXISTS nas.idx_audio_chunks_timestamp ON audio_chunks(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_audio_trans_chunk_id ON audio_transcriptions(install_id, audio_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_audio_trans_timestamp ON audio_transcriptions(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_audio_trans_speaker ON audio_transcriptions(install_id, speaker_id, timestamp DESC);
CREATE INDEX IF NOT EXISTS nas.idx_speaker_emb_speaker_id ON speaker_embeddings(install_id, speaker_id);
CREATE INDEX IF NOT EXISTS nas.idx_audio_tags_chunk_id ON audio_tags(install_id, audio_chunk_id);
DETACH nas;
"
# ─── FTS TABLES (contentless, install-safe) ───────────────────────────────
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url,
install_id UNINDEXED, source_id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role,
install_id UNINDEXED, source_id UNINDEXED, frame_id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content, app_name, window_title, element_name,
install_id UNINDEXED, source_id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.audio_transcriptions_fts USING fts5(
transcription, device,
speaker_id UNINDEXED, install_id UNINDEXED, source_id UNINDEXED,
tokenize='unicode61'
);
DETACH nas;
"
# ─── BUILD COLUMN LISTS ───────────────────────────────────────────────────
FRAMES_COLS=$(build_col_list frames)
ELEMENTS_COLS=$(build_col_list elements)
ELEMENTS_COLS_E=$(build_col_list elements e)
UI_EVENTS_COLS=$(build_col_list ui_events)
OCR_TEXT_COLS=$(build_col_list ocr_text)
OCR_TEXT_COLS_O=$(build_col_list ocr_text o)
VIDEO_CHUNKS_COLS=$(build_col_list video_chunks)
MEETINGS_COLS=$(build_col_list meetings)
ACHUNKS_COLS=$(build_col_list audio_chunks)
ATRANS_COLS=$(build_col_list audio_transcriptions)
ATRANS_COLS_T=$(build_col_list audio_transcriptions t)
SPEAKERS_COLS=$(build_col_list speakers)
SEMB_COLS=$(build_col_list speaker_embeddings)
ATAGS_COLS=$(build_col_list audio_tags)
ATAGS_COLS_AT=$(build_col_list audio_tags at)
TAGS_COLS=$(build_col_list tags)
VTAGS_COLS=$(build_col_list vision_tags)
VTAGS_COLS_VT=$(build_col_list vision_tags vt)
# ─── SYNC VISION DATA ─────────────────────────────────────────────────────
step "Syncing vision data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks ($VIDEO_CHUNKS_COLS, install_id)
SELECT $VIDEO_CHUNKS_COLS, '$INSTALL_ID' FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames ($FRAMES_COLS, install_id)
SELECT $FRAMES_COLS, '$INSTALL_ID' FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text ($OCR_TEXT_COLS, install_id)
SELECT $OCR_TEXT_COLS_O, '$INSTALL_ID' FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events ($UI_EVENTS_COLS, install_id)
SELECT $UI_EVENTS_COLS, '$INSTALL_ID' FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements ($ELEMENTS_COLS, install_id)
SELECT $ELEMENTS_COLS_E, '$INSTALL_ID' FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings ($MEETINGS_COLS, install_id)
SELECT $MEETINGS_COLS, '$INSTALL_ID' FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── SYNC AUDIO DATA ──────────────────────────────────────────────────────
step "Syncing audio data for $TARGET_DATE"
run_sqlite_heredoc "speakers ($SRC_SPEAKERS rows, all)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.speakers ($SPEAKERS_COLS, install_id)
SELECT $SPEAKERS_COLS, '$INSTALL_ID' FROM main.speakers;
DETACH nas;
"
run_sqlite_heredoc "speaker_embeddings ($SRC_SEMB rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.speaker_embeddings ($SEMB_COLS, install_id)
SELECT $SEMB_COLS, '$INSTALL_ID' FROM main.speaker_embeddings;
DETACH nas;
"
run_sqlite_heredoc "audio_chunks ($SRC_ACHUNKS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.audio_chunks ($ACHUNKS_COLS, install_id)
SELECT $ACHUNKS_COLS, '$INSTALL_ID' FROM main.audio_chunks WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "audio_transcriptions ($SRC_ATRANS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.audio_transcriptions ($ATRANS_COLS, install_id)
SELECT $ATRANS_COLS_T, '$INSTALL_ID' FROM main.audio_transcriptions t
JOIN main.audio_chunks c ON t.audio_chunk_id = c.id
WHERE date(c.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "audio_tags ($SRC_ATAGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.audio_tags ($ATAGS_COLS, install_id)
SELECT $ATAGS_COLS_AT, '$INSTALL_ID' FROM main.audio_tags at
JOIN main.audio_chunks c ON at.audio_chunk_id = c.id
WHERE date(c.timestamp) = '$TARGET_DATE';
DETACH nas;
"
# ─── SYNC SHARED ──────────────────────────────────────────────────────────
step "Syncing shared tables (tags, vision_tags)"
run_sqlite_heredoc "tags ($SRC_TAGS rows, all)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.tags ($TAGS_COLS, install_id)
SELECT $TAGS_COLS, '$INSTALL_ID' FROM main.tags;
DETACH nas;
"
run_sqlite_heredoc "vision_tags ($SRC_VTAGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.vision_tags ($VTAGS_COLS, install_id)
SELECT $VTAGS_COLS_VT, '$INSTALL_ID' FROM main.vision_tags vt
JOIN main.frames f ON vt.vision_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE (contentless, auto-rowid, no collisions) ──────────────────
# No `rowid` specified; SQLite assigns a fresh one. install_id + source_id
# are UNINDEXED columns so JOIN-back-to-base queries work.
step "Updating FTS indexes"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(full_text, app_name, window_name, browser_url, install_id, source_id)
SELECT full_text, app_name, window_name, browser_url, install_id, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND install_id = '$INSTALL_ID'
AND full_text IS NOT NULL AND full_text != '';
DETACH nas;
"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(text, role, install_id, source_id, frame_id)
SELECT e.text, e.role, e.install_id, e.id, e.frame_id
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id AND e.install_id = f.install_id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.install_id = '$INSTALL_ID'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(text_content, app_name, window_title, element_name, install_id, source_id)
SELECT text_content, app_name, window_title, element_name, install_id, id
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND install_id = '$INSTALL_ID'
AND text_content IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "audio_transcriptions_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.audio_transcriptions_fts(transcription, device, speaker_id, install_id, source_id)
SELECT t.transcription, COALESCE(t.device,''), t.speaker_id, t.install_id, t.id
FROM nas.audio_transcriptions t
JOIN nas.audio_chunks c ON t.audio_chunk_id = c.id AND t.install_id = c.install_id
WHERE date(c.timestamp) = '$TARGET_DATE'
AND t.install_id = '$INSTALL_ID'
AND t.transcription IS NOT NULL AND t.transcription != '';
DETACH nas;
"
# ─── VERIFY ───────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE install_id='$INSTALL_ID' AND frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE install_id='$INSTALL_ID' AND frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_ACHUNKS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_ATRANS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM audio_transcriptions WHERE install_id='$INSTALL_ID' AND audio_chunk_id IN (SELECT id FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_ATAGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM audio_tags WHERE install_id='$INSTALL_ID' AND audio_chunk_id IN (SELECT id FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_VTAGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM vision_tags WHERE install_id='$INSTALL_ID' AND vision_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
check "audio_chunks" "$V_ACHUNKS" "$SRC_ACHUNKS"
check "audio_transcriptions" "$V_ATRANS" "$SRC_ATRANS"
check "audio_tags" "$V_ATAGS" "$SRC_ATAGS"
check "vision_tags" "$V_VTAGS" "$SRC_VTAGS"
fi
# ─── COPY FRAME DATA FOLDER ──────────────────────────────────────────────────
step "Copying frame data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-40s " "rsync frames → NAS"
rsync -a --ignore-existing "$DATA_SRC/" "$NAS_DATA/$TARGET_DATE/" 2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" 2>/dev/null | grep -v '^audio$' | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -ge "$SRC_FILES" ]; then
printf "\r %-40s ✓ %dm%02ds (%s files, %s)\n" \
"rsync frames → NAS" "$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-40s ✗ %s / %s files\n" "rsync frames → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-40s %s\n" "rsync frames → NAS" "skipped (no source dir)"
fi
# ─── COPY AUDIO FILES ────────────────────────────────────────────────────────
# Audio is flat in ~/.screenpipe/data/ with date in filename, e.g.
# System Audio (output)_2026-05-11_13-48-12.mp4
# soundcore AeroClip (input)_2026-05-10_11-10-32.mp4
# Mirror to $NAS_DATA/<date>/audio/ so each day's archive is self-contained.
step "Copying audio files for $TARGET_DATE"
shopt -s nullglob
AUDIO_FILES=( "$HOME/.screenpipe/data/"*_"${TARGET_DATE}"_*.mp4 )
shopt -u nullglob
if [ ${#AUDIO_FILES[@]} -gt 0 ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE/audio"
RSYNC_START=$(date +%s)
printf " %-40s " "rsync audio → NAS"
rsync -a --ignore-existing "${AUDIO_FILES[@]}" "$NAS_DATA/$TARGET_DATE/audio/" 2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_AUDIO=$(ls "$NAS_DATA/$TARGET_DATE/audio" | wc -l | tr -d ' ')
AUDIO_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE/audio" | cut -f1)
printf "\r %-40s ✓ %dm%02ds (%s files, %s)\n" \
"rsync audio → NAS" "$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_AUDIO" "$AUDIO_SIZE" | tee -a "$LOG_FILE"
else
printf " %-40s %s\n" "rsync audio → NAS" "skipped (no audio for date)"
fi
# ─── COPY LOGS ────────────────────────────────────────────────────────────────
step "Copying screenpipe logs for $TARGET_DATE"
NAS_LOGS="$NAS_MOUNT/logs"
mkdir -p "$NAS_LOGS"
shopt -s nullglob
LOG_FILES=( "$HOME/.screenpipe/screenpipe.$TARGET_DATE."*.log )
shopt -u nullglob
if [ ${#LOG_FILES[@]} -gt 0 ]; then
printf " %-40s " "rsync logs → NAS"
rsync -a "${LOG_FILES[@]}" "$NAS_LOGS/" 2>>"$LOG_FILE"
TOTAL_SIZE=$(du -ch "${LOG_FILES[@]}" | tail -1 | cut -f1)
printf "✓ %d file(s), %s\n" "${#LOG_FILES[@]}" "$TOTAL_SIZE" | tee -a "$LOG_FILE"
else
printf " %-40s %s\n" "rsync logs → NAS" "skipped (no matching logs)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE (install $INSTALL_ID)"
log "========================================"
rsync -a "$HOME/.screenpipe/sync.log" "$NAS_LOGS/sync.log" 2>/dev/null || true
done
step "Reconciling NAS schema with source"
for tbl in "${ALL_SYNC_TABLES[@]}"; do
ensure_columns "$tbl"
done
run_sqlite_heredoc "creating indexes" "
ATTACH '$NAS_DB' AS nas;
-- vision
CREATE INDEX IF NOT EXISTS nas.idx_frames_timestamp ON frames(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_frames_app_name ON frames(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_window_name ON frames(window_name);
CREATE INDEX IF NOT EXISTS nas.idx_frames_video_chunk_id ON frames(video_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_frames_document_path ON frames(document_path) WHERE document_path IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_id ON elements(install_id, frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_elements_frame_src_role ON elements(install_id, frame_id, source, role) WHERE text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_elements_onscreen_frame ON elements(install_id, frame_id) WHERE on_screen = 1 AND text IS NOT NULL;
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_timestamp ON ui_events(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_app_name ON ui_events(app_name);
CREATE INDEX IF NOT EXISTS nas.idx_ui_events_frame_id ON ui_events(install_id, frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_ocr_text_frame_id ON ocr_text(install_id, frame_id);
CREATE INDEX IF NOT EXISTS nas.idx_meetings_start ON meetings(meeting_start);
CREATE INDEX IF NOT EXISTS nas.idx_video_chunks_device ON video_chunks(device_name);
-- audio
CREATE INDEX IF NOT EXISTS nas.idx_audio_chunks_timestamp ON audio_chunks(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_audio_trans_chunk_id ON audio_transcriptions(install_id, audio_chunk_id);
CREATE INDEX IF NOT EXISTS nas.idx_audio_trans_timestamp ON audio_transcriptions(timestamp);
CREATE INDEX IF NOT EXISTS nas.idx_audio_trans_speaker ON audio_transcriptions(install_id, speaker_id, timestamp DESC);
CREATE INDEX IF NOT EXISTS nas.idx_speaker_emb_speaker_id ON speaker_embeddings(install_id, speaker_id);
CREATE INDEX IF NOT EXISTS nas.idx_audio_tags_chunk_id ON audio_tags(install_id, audio_chunk_id);
DETACH nas;
"
# ─── FTS TABLES (contentless, install-safe) ───────────────────────────────
run_sqlite_heredoc "creating FTS tables" "
ATTACH '$NAS_DB' AS nas;
CREATE VIRTUAL TABLE IF NOT EXISTS nas.frames_fts USING fts5(
full_text, app_name, window_name, browser_url,
install_id UNINDEXED, source_id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.elements_fts USING fts5(
text, role,
install_id UNINDEXED, source_id UNINDEXED, frame_id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.ui_events_fts USING fts5(
text_content, app_name, window_title, element_name,
install_id UNINDEXED, source_id UNINDEXED,
tokenize='unicode61'
);
CREATE VIRTUAL TABLE IF NOT EXISTS nas.audio_transcriptions_fts USING fts5(
transcription, device,
speaker_id UNINDEXED, install_id UNINDEXED, source_id UNINDEXED,
tokenize='unicode61'
);
DETACH nas;
"
# ─── BUILD COLUMN LISTS ───────────────────────────────────────────────────
FRAMES_COLS=$(build_col_list frames)
ELEMENTS_COLS=$(build_col_list elements)
ELEMENTS_COLS_E=$(build_col_list elements e)
UI_EVENTS_COLS=$(build_col_list ui_events)
OCR_TEXT_COLS=$(build_col_list ocr_text)
OCR_TEXT_COLS_O=$(build_col_list ocr_text o)
VIDEO_CHUNKS_COLS=$(build_col_list video_chunks)
MEETINGS_COLS=$(build_col_list meetings)
ACHUNKS_COLS=$(build_col_list audio_chunks)
ATRANS_COLS=$(build_col_list audio_transcriptions)
ATRANS_COLS_T=$(build_col_list audio_transcriptions t)
SPEAKERS_COLS=$(build_col_list speakers)
SEMB_COLS=$(build_col_list speaker_embeddings)
ATAGS_COLS=$(build_col_list audio_tags)
ATAGS_COLS_AT=$(build_col_list audio_tags at)
TAGS_COLS=$(build_col_list tags)
VTAGS_COLS=$(build_col_list vision_tags)
VTAGS_COLS_VT=$(build_col_list vision_tags vt)
# ─── SYNC VISION DATA ─────────────────────────────────────────────────────
step "Syncing vision data for $TARGET_DATE"
run_sqlite_heredoc "video_chunks" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.video_chunks ($VIDEO_CHUNKS_COLS, install_id)
SELECT $VIDEO_CHUNKS_COLS, '$INSTALL_ID' FROM main.video_chunks
WHERE id IN (
SELECT DISTINCT video_chunk_id FROM main.frames
WHERE date(timestamp) = '$TARGET_DATE' AND video_chunk_id IS NOT NULL
);
DETACH nas;
"
run_sqlite_heredoc "frames ($SRC_FRAMES rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.frames ($FRAMES_COLS, install_id)
SELECT $FRAMES_COLS, '$INSTALL_ID' FROM main.frames WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ocr_text ($SRC_OCR rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ocr_text ($OCR_TEXT_COLS, install_id)
SELECT $OCR_TEXT_COLS_O, '$INSTALL_ID' FROM main.ocr_text o
JOIN main.frames f ON o.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "ui_events ($SRC_UI rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.ui_events ($UI_EVENTS_COLS, install_id)
SELECT $UI_EVENTS_COLS, '$INSTALL_ID' FROM main.ui_events WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "elements ($SRC_ELEMENTS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.elements ($ELEMENTS_COLS, install_id)
SELECT $ELEMENTS_COLS_E, '$INSTALL_ID' FROM main.elements e
JOIN main.frames f ON e.frame_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "meetings ($SRC_MEETINGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.meetings ($MEETINGS_COLS, install_id)
SELECT $MEETINGS_COLS, '$INSTALL_ID' FROM main.meetings WHERE date(meeting_start) = '$TARGET_DATE';
DETACH nas;
"
# ─── SYNC AUDIO DATA ──────────────────────────────────────────────────────
step "Syncing audio data for $TARGET_DATE"
run_sqlite_heredoc "speakers ($SRC_SPEAKERS rows, all)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.speakers ($SPEAKERS_COLS, install_id)
SELECT $SPEAKERS_COLS, '$INSTALL_ID' FROM main.speakers;
DETACH nas;
"
run_sqlite_heredoc "speaker_embeddings ($SRC_SEMB rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.speaker_embeddings ($SEMB_COLS, install_id)
SELECT $SEMB_COLS, '$INSTALL_ID' FROM main.speaker_embeddings;
DETACH nas;
"
run_sqlite_heredoc "audio_chunks ($SRC_ACHUNKS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.audio_chunks ($ACHUNKS_COLS, install_id)
SELECT $ACHUNKS_COLS, '$INSTALL_ID' FROM main.audio_chunks WHERE date(timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "audio_transcriptions ($SRC_ATRANS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.audio_transcriptions ($ATRANS_COLS, install_id)
SELECT $ATRANS_COLS_T, '$INSTALL_ID' FROM main.audio_transcriptions t
JOIN main.audio_chunks c ON t.audio_chunk_id = c.id
WHERE date(c.timestamp) = '$TARGET_DATE';
DETACH nas;
"
run_sqlite_heredoc "audio_tags ($SRC_ATAGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.audio_tags ($ATAGS_COLS, install_id)
SELECT $ATAGS_COLS_AT, '$INSTALL_ID' FROM main.audio_tags at
JOIN main.audio_chunks c ON at.audio_chunk_id = c.id
WHERE date(c.timestamp) = '$TARGET_DATE';
DETACH nas;
"
# ─── SYNC SHARED ──────────────────────────────────────────────────────────
step "Syncing shared tables (tags, vision_tags)"
run_sqlite_heredoc "tags ($SRC_TAGS rows, all)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.tags ($TAGS_COLS, install_id)
SELECT $TAGS_COLS, '$INSTALL_ID' FROM main.tags;
DETACH nas;
"
run_sqlite_heredoc "vision_tags ($SRC_VTAGS rows)" "
ATTACH '$NAS_DB' AS nas;
INSERT OR IGNORE INTO nas.vision_tags ($VTAGS_COLS, install_id)
SELECT $VTAGS_COLS_VT, '$INSTALL_ID' FROM main.vision_tags vt
JOIN main.frames f ON vt.vision_id = f.id
WHERE date(f.timestamp) = '$TARGET_DATE';
DETACH nas;
"
# ─── FTS UPDATE (contentless, auto-rowid, no collisions) ──────────────────
# No `rowid` specified; SQLite assigns a fresh one. install_id + source_id
# are UNINDEXED columns so JOIN-back-to-base queries work.
step "Updating FTS indexes"
run_sqlite_heredoc "frames_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.frames_fts(full_text, app_name, window_name, browser_url, install_id, source_id)
SELECT full_text, app_name, window_name, browser_url, install_id, id
FROM nas.frames
WHERE date(timestamp) = '$TARGET_DATE'
AND install_id = '$INSTALL_ID'
AND full_text IS NOT NULL AND full_text != '';
DETACH nas;
"
run_sqlite_heredoc "elements_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.elements_fts(text, role, install_id, source_id, frame_id)
SELECT e.text, e.role, e.install_id, e.id, e.frame_id
FROM nas.elements e
JOIN nas.frames f ON e.frame_id = f.id AND e.install_id = f.install_id
WHERE date(f.timestamp) = '$TARGET_DATE'
AND e.install_id = '$INSTALL_ID'
AND e.text IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "ui_events_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.ui_events_fts(text_content, app_name, window_title, element_name, install_id, source_id)
SELECT text_content, app_name, window_title, element_name, install_id, id
FROM nas.ui_events
WHERE date(timestamp) = '$TARGET_DATE'
AND install_id = '$INSTALL_ID'
AND text_content IS NOT NULL;
DETACH nas;
"
run_sqlite_heredoc "audio_transcriptions_fts" "
ATTACH '$NAS_DB' AS nas;
INSERT INTO nas.audio_transcriptions_fts(transcription, device, speaker_id, install_id, source_id)
SELECT t.transcription, COALESCE(t.device,''), t.speaker_id, t.install_id, t.id
FROM nas.audio_transcriptions t
JOIN nas.audio_chunks c ON t.audio_chunk_id = c.id AND t.install_id = c.install_id
WHERE date(c.timestamp) = '$TARGET_DATE'
AND t.install_id = '$INSTALL_ID'
AND t.transcription IS NOT NULL AND t.transcription != '';
DETACH nas;
"
# ─── VERIFY ───────────────────────────────────────────────────────────────
step "Verifying DB"
V_FRAMES=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_ELEMENTS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM elements WHERE install_id='$INSTALL_ID' AND frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_UI=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ui_events WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_OCR=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM ocr_text WHERE install_id='$INSTALL_ID' AND frame_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_MEETINGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM meetings WHERE date(meeting_start) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_ACHUNKS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID';")
V_ATRANS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM audio_transcriptions WHERE install_id='$INSTALL_ID' AND audio_chunk_id IN (SELECT id FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_ATAGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM audio_tags WHERE install_id='$INSTALL_ID' AND audio_chunk_id IN (SELECT id FROM audio_chunks WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
V_VTAGS=$(sqlite3 "$NAS_DB" "SELECT COUNT(*) FROM vision_tags WHERE install_id='$INSTALL_ID' AND vision_id IN (SELECT id FROM frames WHERE date(timestamp) = '$TARGET_DATE' AND install_id='$INSTALL_ID');")
check "frames" "$V_FRAMES" "$SRC_FRAMES"
check "elements" "$V_ELEMENTS" "$SRC_ELEMENTS"
check "ui_events" "$V_UI" "$SRC_UI"
check "ocr_text" "$V_OCR" "$SRC_OCR"
check "meetings" "$V_MEETINGS" "$SRC_MEETINGS"
check "audio_chunks" "$V_ACHUNKS" "$SRC_ACHUNKS"
check "audio_transcriptions" "$V_ATRANS" "$SRC_ATRANS"
check "audio_tags" "$V_ATAGS" "$SRC_ATAGS"
check "vision_tags" "$V_VTAGS" "$SRC_VTAGS"
fi
# ─── COPY FRAME DATA FOLDER ──────────────────────────────────────────────────
step "Copying frame data folder for $TARGET_DATE"
if [ -d "$DATA_SRC" ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE"
RSYNC_START=$(date +%s)
printf " %-40s " "rsync frames → NAS"
rsync -a --ignore-existing "$DATA_SRC/" "$NAS_DATA/$TARGET_DATE/" 2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_FILES=$(ls "$NAS_DATA/$TARGET_DATE" 2>/dev/null | grep -v '^audio$' | wc -l | tr -d ' ')
SRC_FILES=$(ls "$DATA_SRC" | wc -l | tr -d ' ')
COPIED_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE" | cut -f1)
if [ "$COPIED_FILES" -ge "$SRC_FILES" ]; then
printf "\r %-40s ✓ %dm%02ds (%s files, %s)\n" \
"rsync frames → NAS" "$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_FILES" "$COPIED_SIZE" | tee -a "$LOG_FILE"
else
printf "\r %-40s ✗ %s / %s files\n" "rsync frames → NAS" "$COPIED_FILES" "$SRC_FILES" | tee -a "$LOG_FILE"
fi
else
printf " %-40s %s\n" "rsync frames → NAS" "skipped (no source dir)"
fi
# ─── COPY AUDIO FILES ────────────────────────────────────────────────────────
# Audio is flat in ~/.screenpipe/data/ with date in filename, e.g.
# System Audio (output)_2026-05-11_13-48-12.mp4
# soundcore AeroClip (input)_2026-05-10_11-10-32.mp4
# Mirror to $NAS_DATA/<date>/audio/ so each day's archive is self-contained.
step "Copying audio files for $TARGET_DATE"
shopt -s nullglob
AUDIO_FILES=( "$HOME/.screenpipe/data/"*_"${TARGET_DATE}"_*.mp4 )
shopt -u nullglob
if [ ${#AUDIO_FILES[@]} -gt 0 ]; then
mkdir -p "$NAS_DATA/$TARGET_DATE/audio"
RSYNC_START=$(date +%s)
printf " %-40s " "rsync audio → NAS"
rsync -a --ignore-existing "${AUDIO_FILES[@]}" "$NAS_DATA/$TARGET_DATE/audio/" 2>>"$LOG_FILE"
RSYNC_DUR=$(( $(date +%s) - RSYNC_START ))
COPIED_AUDIO=$(ls "$NAS_DATA/$TARGET_DATE/audio" | wc -l | tr -d ' ')
AUDIO_SIZE=$(du -sh "$NAS_DATA/$TARGET_DATE/audio" | cut -f1)
printf "\r %-40s ✓ %dm%02ds (%s files, %s)\n" \
"rsync audio → NAS" "$(( RSYNC_DUR / 60 ))" "$(( RSYNC_DUR % 60 ))" \
"$COPIED_AUDIO" "$AUDIO_SIZE" | tee -a "$LOG_FILE"
else
printf " %-40s %s\n" "rsync audio → NAS" "skipped (no audio for date)"
fi
# ─── COPY LOGS ────────────────────────────────────────────────────────────────
step "Copying screenpipe logs for $TARGET_DATE"
NAS_LOGS="$NAS_MOUNT/logs"
mkdir -p "$NAS_LOGS"
shopt -s nullglob
LOG_FILES=( "$HOME/.screenpipe/screenpipe.$TARGET_DATE."*.log )
shopt -u nullglob
if [ ${#LOG_FILES[@]} -gt 0 ]; then
printf " %-40s " "rsync logs → NAS"
rsync -a "${LOG_FILES[@]}" "$NAS_LOGS/" 2>>"$LOG_FILE"
TOTAL_SIZE=$(du -ch "${LOG_FILES[@]}" | tail -1 | cut -f1)
printf "✓ %d file(s), %s\n" "${#LOG_FILES[@]}" "$TOTAL_SIZE" | tee -a "$LOG_FILE"
else
printf " %-40s %s\n" "rsync logs → NAS" "skipped (no matching logs)"
fi
# ─── SUMMARY ──────────────────────────────────────────────────────────────────
TOTAL_ELAPSED=$(( $(date +%s) - SCRIPT_START ))
DB_SIZE=$(du -sh "$NAS_DB" | cut -f1)
echo ""
log "Archive DB size: $DB_SIZE"
log "Total time: $(( TOTAL_ELAPSED / 60 ))m$(( TOTAL_ELAPSED % 60 ))s"
log "Sync complete for $TARGET_DATE (install $INSTALL_ID)"
log "========================================"
rsync -a "$HOME/.screenpipe/sync.log" "$NAS_LOGS/sync.log" 2>/dev/null || true
Implement and run pipe l…, Editor Group 2
Problems (⇧⌘M)
PROBLEMS
Output (⇧⌘U)
OUTPUT
Debug Console (⇧⌘Y)
DEBUG CONSOLE
Terminal (⌃`)
TERMINAL
Ports - 1 forwarded port
PORTS
1
Remote - SSH - Output...
|
26618
|
NULL
|
NULL
|
NULL
|
|
18986
|
815
|
11
|
2026-05-11T12:07:49.796329+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778501269796_m2.jpg...
|
Code
|
Review rate limit handli… — app
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 22 pending changes
22
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update
2
Testing
Claude Code
EXPLORER
EXPLORER
Explorer Section: app
Explorer Section: app
APP
AjReports
Audio
AutomatedReports
Calendar
Crm
Delete
Hubspot
Traits
FetchMergedObjectsPageJob.php
HubspotAppUninstallJob.php
ImportAccountBatch.php
ImportBatchJobTrait.php
ImportContactBatch.php
ImportOpportunityBatch.php
ProcessHubspotWebhookEventsTrait.php
ProcessInternalWebhookEventsJob.php
ProcessMergedObjectJob.php
ProcessWebhookEventsJob.php
UpdateDealWebhookSubscriptionJob.php
Salesforce
AutologDelayedToCrm.php
CheckAndRetryRemoteMatch.php
CreateFollowupActivity.php
CreateNotes.php
MatchActivitiesToNewOpportunity.php
MatchActivityCrmData.php
M
NoteObject.php
SaveActivity.php
SaveTranscription.php
SetupLayout.php
SyncActivity.php
SyncFieldMetadata.php
SyncHubspotObjects.php
SyncLeads.php
SyncObjects.php
SyncOpportunitiesJob.php
SyncOpportunity.php
SyncProfileMetadata.php
SyncTeamFieldsJob.php
SyncTeamMetadata.php
UpdateOpportunitySpecifications.php
UpdateStage.php
DealRisks
Mailbox
MeetingBot
Middleware
HandleHubspotRateLimit.php
M
RateLimited.php
Jobs
app
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
MySQL Section
MYSQL
MYSQL
MatchActivityCrmData.php, Editor Group 1
RateLimitException.php, Editor Group 1
HandleHubspotRateLimit.php, Editor Group 1
Client.php, Editor Group 1
HubspotPaginationService.php, Editor Group 1
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm;
use Exception;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Database\Connection;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue\Constants;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Jobs\Job;
use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
use Jiminny\Models\Activity;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\ActivityRepository;
use Jiminny\Services\Crm\CrmActivityService;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Throwable;
class MatchActivityCrmData extends Job implements ShouldQueue, ShouldBeUnique
{
use InteractsWithQueue;
use SerializesModels;
public int $maxExceptions = 3;
private const int RETRY_WINDOW_MINUTES = 120;
private int $activityId;
private ?Configuration $fromConfiguration;
private bool $remoteSearch;
public function middleware(): array
{
return [new HandleHubspotRateLimit()];
}
public function retryUntil(): \DateTimeInterface
{
return now()->addMinutes(self::RETRY_WINDOW_MINUTES);
}
public function __construct(
int $activityId,
?Configuration $fromConfiguration = null,
bool $remoteSearch = false,
) {
$this->activityId = $activityId;
$this->fromConfiguration = $fromConfiguration;
$this->remoteSearch = $remoteSearch;
$this->onQueue(Constants::QUEUE_ANALYTICS_LOW);
}
public function uniqueId(): string
{
$configId = $this->fromConfiguration?->getId() ?? 0;
$remote = $this->remoteSearch ? 'remote' : 'local';
return "$this->activityId:$configId:$remote";
}
public function timeout(): int
{
return 300; // 5 minutes max execution time
}
public function uniqueFor(): int
{
return self::RETRY_WINDOW_MINUTES * 60 + 60;
}
public function backoff(): array
{
return [30, 90, 180];
}
/**
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws Exception|Throwable
*/
public function handle(
ActivityRepository $activityRepository,
CrmActivityService $crmActivityService,
Connection $connection,
): void {
$activity = $activityRepository->findById($this->activityId);
if ($activity === null) {
throw new InvalidArgumentException('[MatchActivityCrmData] Cannot find activity.');
}
try {
$connection->transaction(function () use ($activity, $crmActivityService, $activityRepository) {
Log::info('[MatchActivityCrmData] Starting CRM data matching', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'set_configuration' => $this->fromConfiguration?->getId(),
'old_state' => [
'lead_id' => $activity->getLead()?->getId(),
'contact_id' => $activity->getContact()?->getId(),
'account_id' => $activity->getAccount()?->getId(),
'opportunity_id' => $activity->getOpportunity()?->getId(),
'stage_id' => $activity->getStage()?->getId(),
],
]);
$this->resetCrmMappings($activity, $activityRepository);
$this->switchCrmConfigurationIfNeeded($activity);
$activity->refresh();
$crmActivityService->updateCrmData(
activity: $activity,
remoteSearch: $this->remoteSearch,
);
$hasMatch = $activity->getLead() !== null
|| $activity->getContact() !== null
|| $activity->getAccount() !== null
|| $activity->getOpportunity() !== null;
if ($hasMatch) {
Log::info('[MatchActivityCrmData] Successfully matched CRM data', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'lead_id' => $activity->getLead()?->getId(),
'contact_id' => $activity->getContact()?->getId(),
'account_id' => $activity->getAccount()?->getId(),
'opportunity_id' => $activity->getOpportunity()?->getId(),
'stage_id' => $activity->getStage()?->getId(),
]);
} else {
Log::info('[MatchActivityCrmData] No CRM match found', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
]);
}
});
} catch (Throwable $e) {
if (! $e instanceof RateLimitException) {
Log::error('[MatchActivityCrmData] Failed to match CRM data', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'exception' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
]);
}
throw $e;
}
}
public function failed(Throwable $exception): void
{
Log::error('[MatchActivityCrmData] Job permanently failed after all retries', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'from_configuration' => $this->fromConfiguration?->getId(),
'exception' => $exception->getMessage(),
'attempts' => $this->attempts(),
]);
}
private function resetCrmMappings(
Activity $activity,
ActivityRepository $activityRepository
): void {
$activity->update([
'lead_id' => null,
'contact_id' => null,
'account_id' => null,
'opportunity_id' => null,
'stage_id' => null,
]);
$participantsOldState = $activityRepository->getActivityParticipants($activity)
->map(function ($participant) {
return [
'id' => $participant->id,
'user_id' => $participant->user_id,
'contact_id' => $participant->contact_id,
'lead_id' => $participant->lead_id,
];
});
if ($participantsOldState->isNotEmpty()) {
Log::info('[MatchActivityCrmData] Participants old state', [
'activity' => $this->activityId,
'participants' => $participantsOldState->toArray(),
]);
}
$activity->participants()->update([
'user_id' => null,
'contact_id' => null,
'lead_id' => null,
]);
}
private function switchCrmConfigurationIfNeeded(Activity $activity): void
{
if ($this->fromConfiguration === null) {
return;
}
if ($activity->getCrm()?->getId() === $this->fromConfiguration->getId()) {
return;
}
Log::info('[MatchActivityCrmData] Switching CRM configuration', [
'activity' => $this->activityId,
'old_configuration' => $activity->getCrm()?->getId(),
'new_configuration' => $this->fromConfiguration->getId(),
]);
$activity->update([
'crm_configuration_id' => $this->fromConfiguration->getId(),
'crm_provider_id' => null,
]);
}
}
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm;
use Exception;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Database\Connection;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue\Constants;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Jobs\Job;
use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
use Jiminny\Models\Activity;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\ActivityRepository;
use Jiminny\Services\Crm\CrmActivityService;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Throwable;
class MatchActivityCrmData extends Job implements ShouldQueue, ShouldBeUnique
{
use InteractsWithQueue;
use SerializesModels;
public int $maxExceptions = 3;
private const int RETRY_WINDOW_MINUTES = 120;
private int $activityId;
private ?Configuration $fromConfiguration;
private bool $remoteSearch;
public function middleware(): array
{
return [new HandleHubspotRateLimit()];
}
public function retryUntil(): \DateTimeInterface
{
return now()->addMinutes(self::RETRY_WINDOW_MINUTES);
}
public function __construct(
int $activityId,
?Configuration $fromConfiguration = null,
bool $remoteSearch = false,
) {
$this->activityId = $activityId;
$this->fromConfiguration = $fromConfiguration;
$this->remoteSearch = $remoteSearch;
$this->onQueue(Constants::QUEUE_ANALYTICS_LOW);
}
public function uniqueId(): string
{
$configId = $this->fromConfiguration?->getId() ?? 0;
$remote = $this->remoteSearch ? 'remote' : 'local';
return "$this->activityId:$configId:$remote";
}
public function timeout(): int
{
return 300; // 5 minutes max execution time
}
public function uniqueFor(): int
{
return self::RETRY_WINDOW_MINUTES * 60 + 60;
}
public function backoff(): array
{
return [30, 90, 180];
}
/**
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws Exception|Throwable
*/
public function handle(
ActivityRepository $activityRepository,
CrmActivityService $crmActivityService,
Connection $connection,
): void {
$activity = $activityRepository->findById($this->activityId);
if ($activity === null) {
throw new InvalidArgumentException('[MatchActivityCrmData] Cannot find activity.');
}
try {
$connection->transaction(function () use ($activity, $crmActivityService, $activityRepository) {
Log::info('[MatchActivityCrmData] Starting CRM data matching', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'set_configuration' => $this->fromConfiguration?->getId(),
'old_state' => [
'lead_id' => $activity->getLead()?->getId(),
'contact_id' => $activity->getContact()?->getId(),
'account_id' => $activity->getAccount()?->getId(),
'opportunity_id' => $activity->getOpportunity()?->getId(),
'stage_id' => $activity->getStage()?->getId(),
],
]);
$this->resetCrmMappings($activity, $activityRepository);
$this->switchCrmConfigurationIfNeeded($activity);
$activity->refresh();
$crmActivityService->updateCrmData(
activity: $activity,
remoteSearch: $this->remoteSearch,
);
$hasMatch = $activity->getLead() !== null
|| $activity->getContact() !== null
|| $activity->getAccount() !== null
|| $activity->getOpportunity() !== null;
if ($hasMatch) {
Log::info('[MatchActivityCrmData] Successfully matched CRM data', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'lead_id' => $activity->getLead()?->getId(),
'contact_id' => $activity->getContact()?->getId(),
'account_id' => $activity->getAccount()?->getId(),
'opportunity_id' => $activity->getOpportunity()?->getId(),
'stage_id' => $activity->getStage()?->getId(),
]);
} else {
Log::info('[MatchActivityCrmData] No CRM match found', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
]);
}
});
} catch (Throwable $e) {
if (! $e instanceof RateLimitException) {
Log::error('[MatchActivityCrmData] Failed to match CRM data', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'exception' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
]);
}
throw $e;
}
}
public function failed(Throwable $exception): void
{
Log::error('[MatchActivityCrmData] Job permanently failed after all retries', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'from_configuration' => $this->fromConfiguration?->getId(),
'exception' => $exception->getMessage(),
'attempts' => $this->attempts(),
]);
}
private function resetCrmMappings(
Activity $activity,
ActivityRepository $activityRepository
): void {
$activity->update([
'lead_id' => null,
'contact_id' => null,
'account_id' => null,
'opportunity_id' => null,
'stage_id' => null,
]);
$participantsOldState = $activityRepository->getActivityParticipants($activity)
->map(function ($participant) {
return [
'id' => $participant->id,
'user_id' => $participant->user_id,
'contact_id' => $participant->contact_id,
'lead_id' => $participant->lead_id,
];
});
if ($participantsOldState->isNotEmpty()) {
Log::info('[MatchActivityCrmData] Participants old state', [
'activity' => $this->activityId,
'participants' => $participantsOldState->toArray(),
]);
}
$activity->participants()->update([
'user_id' => null,
'contact_id' => null,
'lead_id' => null,
]);
}
private function switchCrmConfigurationIfNeeded(Activity $activity): void
{
if ($this->fromConfiguration === null) {
return;
}
if ($activity->getCrm()?->getId() === $this->fromConfiguration->getId()) {
return;
}
Log::info('[MatchActivityCrmData] Switching CRM configuration', [
'activity' => $this->activityId,
'old_configuration' => $activity->getCrm()?->getId(),
'new_configuration' => $this->fromConfiguration->getId(),
]);
$activity->update([
'crm_configuration_id' => $this->fromConfiguration->getId(),
'crm_provider_id' => null,
]);
}
}
Review rate limit handli…, Editor Group 2
remote
app (Git) - JY-20725-handle-HS-search-rate-limit*+, Checkout Branch/Tag...
JY-20725-handle-HS-search-rate-limit*+
app (Git) - Publish Branch
Errors: 6, Warnings: 9, Infos: 2
6
9
2
Notifications
key, PHP extension: Premium features not active.
Sign In
Sign In
Info: You have Docker installed on your system. Do you want to install the recommended extensions from Microsoft for it?
Clear
Review rate limit handling for HubSpot job queue
Session history
New session
Message actions
RateLimitException.php#9-9
RateLimitException.php#9-9
Reveiw the diff. Mostly
@app/Jobs/Crm/MatchActivityCrmData.php
,
@app/Exceptions/RateLimitException.php
,
@app/Jobs/Middleware/HandleHubspotRateLimit.php
,
@app/Services/Crm/Hubspot/Client.php
and
@app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php
. The issue is I am trying to make sure that instant spike of MatchActivityCrmData jobs willl handle 429 exceptions from hubspot. Revewi ti carefully and try to see potential issues and bottlenecks. Also RateLimitException was changerd from LogicException to RuntimeException. Is it ok. This exception is used by other paerts of code. Will ti break anything?
Thought for 5s
Thought for 5s
I'll review the implementation carefully. Let me first check how
RateLimitException
is used elsewhere and look at the test files and
PaginationState
.
Bash
Find all usages of RateLimitException outside the changed files
IN
grep -rn "RateLimitException" /Users/lukas/jiminny/app/app --include="*.php" | grep -v "HandleHubspotRateLimit\|MatchActivityCrmData\|Client.php\|RateLimitException.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:13:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
/Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php:17:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php:68: RateLimitException |
/Users/lukas/jiminny/app/app/Component/TranscriptionSummary/Jobs/SummarizeTranscriptionJob.php:15:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/TranscriptionSummary/Jobs/SummarizeTranscriptionJob.php:58: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
/Users/lukas/jiminny/app/app/Component/AiActivityType/Jobs/GenerateAiActivityTypeJob.php:19:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/AiActivityType/Jobs/GenerateAiActivityTypeJob.php:76: RateLimitException |
/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/HubspotClientInterface.php:8:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/HubspotClientInterface.php:50: * @throws RateLimitException When rate limit is hit
/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php:195: // RateLimitException and other exceptions are re-thrown as-is
Read
PaginationState.php
PaginationState.php
Read
HandleHubspotRateLimitTest.php
HandleHubspotRateLimitTest.php
Bash
Check how RateLimitException is used in GenerateActionItemsJob
IN
grep -rn "RateLimitException\|LogicException\|RuntimeException" /Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php | head -20
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:13:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
Bash
Find all catch blocks or instanceof checks for RateLimitException
IN
grep -rn "catch.*RateLimitException\|instanceof RateLimitException" /Users/lukas/jiminny/app/app --include="*.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Jobs/Middleware/HandleHubspotRateLimit.php:11: * Job middleware that catches RateLimitException from HubSpot API calls
/Users/lukas/jiminny/app/app/Jobs/Middleware/HandleHubspotRateLimit.php:24: } catch (RateLimitException $e) {
/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:149: if (! $e instanceof RateLimitException) {
Bash
Find all test references to RateLimitException
IN
grep -rn "RateLimitException" /Users/lukas/jiminny/app/tests --include="*.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:8:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:13:#[CoversClass(RateLimitException::class)]
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:14:class RateLimitExceptionTest extends TestCase
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:18: $exception = new RateLimitException();
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:28: $exception = new RateLimitException('Hubspot rate limit', 30, $previous);
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:52: $exception = new RateLimitException('test', $input);
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:10:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:49: public function testPropagatesNonRateLimitExceptions(): void
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:103: throw new RateLimitException('rate limited', $retryAfter);
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:150: throw new RateLimitException('rate limited', 1);
Bash
Check retry/failure handling in GenerateActionItemsJob
IN
grep -n "RateLimitException\|retryUntil\|backoff\|maxExceptions\|maxTries\|release\|failed" /Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php | head -30
Copy code to clipboard
OUT
13:use Jiminny\Exceptions\RateLimitException;
51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
56: $this->release(30);
Bash
Check retry/failure handling in GenerateAiCallScoringJob
IN
grep -n "RateLimitException\|retryUntil\|backoff\|maxExceptions\|maxTries\|release\|failed" /Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php | head -30
Copy code to clipboard
OUT
17:use Jiminny\Exceptions\RateLimitException;
68: RateLimitException |
75: $this->release(30);
Bash
Check retry config in MatchActivityCrmData
IN
grep -n "retryAfter\|RETRY_WINDOW\|retryUntil\|maxTries" /Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php
Copy code to clipboard
OUT
34: private const int RETRY_WINDOW_MINUTES = 30;
45: public function retryUntil(): \DateTimeInterface
47: return now()->addMinutes(self::RETRY_WINDOW_MINUTES);
77: return self::RETRY_WINDOW_MINUTES * 60 + 60;
Bash
Check the cache key format
IN
grep -n "getRateLimitCacheKey\|hubspot:ratelimit" /Users/lukas/jiminny/app/app/Services/Crm/Hubspot/Client.php
Copy code to clipboard
OUT
78: $cacheKey = $this->getRateLimitCacheKey();
110: private function getRateLimitCacheKey(): string
112: return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
Bash
Find other jobs that might use the rate limit middleware
IN
grep -rn "class.*Middleware\|HandleHubspotRateLimit" /Users/lukas/jiminny/app/app/Jobs --include="*.php" | grep -v "HandleHubspotRateLimit.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:18:use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:42: return [new HandleHubspotRateLimit()];
Read
HubspotClientInterface.php
HubspotClientInterface.php
Thought for 73s
Thought for 73s
Now I have a complete picture. Here's my full analysis:
Review Summary
Review Summary
RuntimeException vs LogicException — Safe ✓
RuntimeException
vs
LogicException
— Safe ✓
The change is semantically correct and won't break anything.
LogicException
is for programmer errors (invalid arguments, contract violations). A rate limit from an external API is a runtime condition —
RuntimeException
is the right parent. All callers catch
RateLimitException
by name explicitly (union catches in
GenerateActionItemsJob
,
GenerateAiCallScoringJob
,
SummarizeTranscriptionJob
,
GenerateAiActivityTypeJob
) or check
instanceof RateLimitException
— none relies on the parent class type, so nothing breaks.
Issue 1 — Circuit breaker stores stale delay (most important bug)
Issue 1 — Circuit breaker stores stale delay (most important bug)
Client.php:94
Client.php:94
Copy code to clipboard
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
The TTL is
$retryAfter
seconds, but the
stored value
is also the original
$retryAfter
. If a second job reads this cache 20 seconds later, it throws
RateLimitException(retryAfter=30)
and gets delayed 30 more seconds — even though only 10 remain. In a spike of 100 jobs, each subsequent job inflates its wait.
Fix:
store the absolute expiry timestamp, reconstruct the remaining delay when reading:
Copy code to clipboard
// on 429:
Redis::setex($cacheKey, $retryAfter, (string) (time() + $retryAfter));
// in the cached-read branch:
$remaining = max(1, (int) $cachedRetryAfter - time());
throw new RateLimitException('Hubspot rate limit (cached circuit-breaker)', $remaining);
Issue 2 — retryUntil() window may expire under sustained rate limiting
Issue 2 —
retryUntil()
window may expire under sustained rate limiting
MatchActivityCrmData.php:45-47
MatchActivityCrmData.php:45-47
retryUntil()
is calculated as
now() + 30 min
at
dispatch time
and stored in the job payload. With
MAX_RETRY_DELAY = 600s
, you only get ~3 rate-limit-triggered releases before the 30-minute window closes and the job is permanently failed. For a heavy 429 spike (daily limit, parsed as 600s), this can easily happen.
Consider increasing
RETRY_WINDOW_MINUTES
to 60 or more, or making it configurable. The
uniqueFor()
value should be updated to match.
Issue 3 — Only search() uses the circuit breaker, but other methods can still hit 429
Issue 3 — Only
search()
uses the circuit breaker, but other methods can still hit 429
Client.php:76-108
Client.php:76-108
executeRequest()
is only called from
search()
. Methods like
getOpportunityById()
,
batchReadObjects()
,
getContactByEmail()
bypass it entirely. If HubSpot's 429 is account-wide (not search-endpoint-specific), those methods will keep firing even while the circuit breaker is supposedly open. This is likely fine because the search endpoint has its own tighter quota (5 RPS), but it's worth being explicit in a comment.
Issue 4 — object $job type in middleware has no compile-time safety
Issue 4 —
object $job
type in middleware has no compile-time safety
HandleHubspotRateLimit.php:20
HandleHubspotRateLimit.php:20
Copy code to clipboard
public function handle(object $job, callable $next): void
Calling
$job->attempts()
and
$job->release()
on
object
will work at runtime since Laravel always passes jobs that use
InteractsWithQueue
, but PHPStan/psalm won't verify this and it could silently break in tests with bare mocks (as your test does use a
Job
mock that has
attempts()
— so the test is fine, but the real type contract is invisible). Minor, but worth tightening to
\Illuminate\Contracts\Queue\Job
.
What works well ✓
What works well ✓
RateLimitException
is caught by the middleware
before
it increments
maxExceptions
, so rate-limit releases don't consume the 3-exception budget for real failures.
The middleware's jitter (
random_int(0, 5)
) prevents thundering herd on release.
The log-sampling logic (
attempts <= 3 || attempts % 10 === 0
) keeps logs useful without flooding.
ShouldBeUnique
+
uniqueFor()
correctly prevents duplicate jobs queuing up during the rate-limit wait window.
RateLimitException
propagates cleanly through the DB transaction (rolled back), then through the job catch block (logged conditionally), then to the middleware which handles it.
The pagination service re-throws
RateLimitException
as-is and resets pagination state on the next job attempt — safe because offset restarts from 0.
Message actions
Expand on 1 and 2. Let's consider there are several jobs running from ten workers. They are out fired instantly, and therefore there is no cache when they look for cache, but once they receive 429, they store cache. Can there be some potential issues with that flow?
Thought for 91s
Thought for 91s...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Explorer (⇧⌘E)","depth":19,"bounds":{"left":0.0,"top":0.047885075,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":true},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.057462092,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Search (⇧⌘F)","depth":19,"bounds":{"left":0.0,"top":0.08619314,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.09577015,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Source Control (⌃⇧G) - 22 pending changes","depth":19,"bounds":{"left":0.0,"top":0.1245012,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.13407822,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"22","depth":22,"bounds":{"left":0.007978723,"top":0.1452514,"width":0.0039893617,"height":0.008778931},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.007978723,"top":0.14604948,"width":0.0023271276,"height":0.007980846}},{"char_start":1,"char_count":1,"bounds":{"left":0.009973404,"top":0.14604948,"width":0.0019946808,"height":0.007980846}}],"role_description":"text"},{"role":"AXRadioButton","text":"Run and Debug (⇧⌘D)","depth":19,"bounds":{"left":0.0,"top":0.16280925,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.17238627,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Remote Explorer","depth":19,"bounds":{"left":0.0,"top":0.20111732,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.21069433,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Extensions (⇧⌘X) - 2 require update","depth":19,"bounds":{"left":0.0,"top":0.23942538,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.2490024,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":22,"bounds":{"left":0.009640957,"top":0.2601756,"width":0.0019946808,"height":0.008778931},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Testing","depth":19,"bounds":{"left":0.0,"top":0.27773345,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":22,"bounds":{"left":0.0039893617,"top":0.28731045,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Claude Code","depth":19,"bounds":{"left":0.0,"top":0.3160415,"width":0.015957447,"height":0.03830806},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"EXPLORER","depth":17,"bounds":{"left":0.022606382,"top":0.047885075,"width":0.018949468,"height":0.02793296},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"EXPLORER","depth":18,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.018949468,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.022606382,"top":0.056664005,"width":0.0023271276,"height":0.0103751}},{"char_start":1,"char_count":7,"bounds":{"left":0.024933511,"top":0.056664005,"width":0.01662234,"height":0.0103751}}],"role_description":"text"},{"role":"AXButton","text":"Explorer Section: app","depth":21,"bounds":{"left":0.015957447,"top":0.07581804,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"Explorer Section: app","depth":22,"bounds":{"left":0.022606382,"top":0.07581804,"width":0.0076462766,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"APP","depth":23,"bounds":{"left":0.022606382,"top":0.079010375,"width":0.0076462766,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.024933511,"top":0.0933759,"width":0.005319149,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AjReports","depth":27,"bounds":{"left":0.03125,"top":0.0933759,"width":0.019614361,"height":0.011173184},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.0933759,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":8,"bounds":{"left":0.034242023,"top":0.0933759,"width":0.01662234,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.024933511,"top":0.110135674,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Audio","depth":27,"bounds":{"left":0.03125,"top":0.110135674,"width":0.011635638,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.11093376,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":4,"bounds":{"left":0.034242023,"top":0.11093376,"width":0.008643617,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.024933511,"top":0.12769353,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AutomatedReports","depth":27,"bounds":{"left":0.03125,"top":0.12769353,"width":0.03756649,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.12849163,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":15,"bounds":{"left":0.034242023,"top":0.12849163,"width":0.034906916,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.024933511,"top":0.1452514,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Calendar","depth":27,"bounds":{"left":0.03125,"top":0.1452514,"width":0.017952127,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03125,"top":0.14604948,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":7,"bounds":{"left":0.034242023,"top":0.14604948,"width":0.015292553,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.024933511,"top":0.16280925,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Crm","depth":27,"bounds":{"left":0.03125,"top":0.16280925,"width":0.00831117,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.10605053,"top":0.16360734,"width":0.004654255,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.027593086,"top":0.18036711,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Delete","depth":27,"bounds":{"left":0.033909574,"top":0.18036711,"width":0.012965426,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.1811652,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":5,"bounds":{"left":0.03723404,"top":0.1811652,"width":0.009640957,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.027593086,"top":0.19792499,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Hubspot","depth":27,"bounds":{"left":0.033909574,"top":0.19792499,"width":0.017287234,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.19872306,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":6,"bounds":{"left":0.03723404,"top":0.19872306,"width":0.013962766,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.03025266,"top":0.21548285,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Traits","depth":27,"bounds":{"left":0.03656915,"top":0.21548285,"width":0.011303191,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03656915,"top":0.21628092,"width":0.0023271276,"height":0.011971269}},{"char_start":1,"char_count":5,"bounds":{"left":0.038896278,"top":0.21628092,"width":0.008976064,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.02925532,"top":0.23144454,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"FetchMergedObjectsPageJob.php","depth":27,"bounds":{"left":0.03656915,"top":0.2330407,"width":0.06881649,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03656915,"top":0.23383878,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":28,"bounds":{"left":0.039228722,"top":0.23383878,"width":0.06615692,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.02925532,"top":0.2490024,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"HubspotAppUninstallJob.php","depth":27,"bounds":{"left":0.03656915,"top":0.25059855,"width":0.059175532,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03656915,"top":0.25139666,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":25,"bounds":{"left":0.039893616,"top":0.25139666,"width":0.055851065,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.02925532,"top":0.26656026,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ImportAccountBatch.php","depth":27,"bounds":{"left":0.03656915,"top":0.26815644,"width":0.050531916,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03656915,"top":0.26895452,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":21,"bounds":{"left":0.037898935,"top":0.26895452,"width":0.04920213,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.02925532,"top":0.28411812,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ImportBatchJobTrait.php","depth":27,"bounds":{"left":0.03656915,"top":0.2857143,"width":0.049867023,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03656915,"top":0.28651237,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":22,"bounds":{"left":0.037898935,"top":0.28651237,"width":0.048537236,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.02925532,"top":0.30167598,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ImportContactBatch.php","depth":27,"bounds":{"left":0.03656915,"top":0.30327216,"width":0.049867023,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03656915,"top":0.30407023,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":21,"bounds":{"left":0.037898935,"top":0.30407023,"width":0.048537236,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.02925532,"top":0.31923383,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ImportOpportunityBatch.php","depth":27,"bounds":{"left":0.03656915,"top":0.32083002,"width":0.057845745,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03656915,"top":0.3216281,"width":0.0013297872,"height":0.011971269}},{"char_start":1,"char_count":25,"bounds":{"left":0.037898935,"top":0.3216281,"width":0.056848403,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.02925532,"top":0.3367917,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ProcessHubspotWebhookEventsTrait.php","depth":27,"bounds":{"left":0.03656915,"top":0.33838788,"width":0.077792555,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03656915,"top":0.33918595,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":35,"bounds":{"left":0.039228722,"top":0.33918595,"width":0.080784574,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.02925532,"top":0.35434955,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ProcessInternalWebhookEventsJob.php","depth":27,"bounds":{"left":0.03656915,"top":0.35594574,"width":0.078457445,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03656915,"top":0.3567438,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":34,"bounds":{"left":0.039228722,"top":0.3567438,"width":0.0774601,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.02925532,"top":0.3719074,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ProcessMergedObjectJob.php","depth":27,"bounds":{"left":0.03656915,"top":0.3735036,"width":0.061170213,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03656915,"top":0.37430167,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":25,"bounds":{"left":0.039228722,"top":0.37430167,"width":0.058843084,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.02925532,"top":0.38946527,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ProcessWebhookEventsJob.php","depth":27,"bounds":{"left":0.03656915,"top":0.39106146,"width":0.06482713,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03656915,"top":0.39185953,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":26,"bounds":{"left":0.039228722,"top":0.39185953,"width":0.06216755,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.02925532,"top":0.40702313,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"UpdateDealWebhookSubscriptionJob.php","depth":27,"bounds":{"left":0.03656915,"top":0.4086193,"width":0.076130316,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.03656915,"top":0.4094174,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":35,"bounds":{"left":0.039893616,"top":0.4094174,"width":0.08111702,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.027593086,"top":0.42617717,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Salesforce","depth":27,"bounds":{"left":0.033909574,"top":0.42617717,"width":0.021276595,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.42697525,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":9,"bounds":{"left":0.03656915,"top":0.42697525,"width":0.01861702,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.44213888,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AutologDelayedToCrm.php","depth":27,"bounds":{"left":0.033909574,"top":0.44373503,"width":0.053856384,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.4445331,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":22,"bounds":{"left":0.036901597,"top":0.4445331,"width":0.05119681,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.45969674,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"CheckAndRetryRemoteMatch.php","depth":27,"bounds":{"left":0.033909574,"top":0.4612929,"width":0.068484046,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.46209097,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":27,"bounds":{"left":0.036901597,"top":0.46209097,"width":0.06549202,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.4772546,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"CreateFollowupActivity.php","depth":27,"bounds":{"left":0.033909574,"top":0.47885075,"width":0.054853722,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.47964883,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":25,"bounds":{"left":0.036901597,"top":0.47964883,"width":0.051861703,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.49481246,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"CreateNotes.php","depth":27,"bounds":{"left":0.033909574,"top":0.4964086,"width":0.034242023,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.49720672,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":14,"bounds":{"left":0.036901597,"top":0.49720672,"width":0.03125,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.5123703,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MatchActivitiesToNewOpportunity.php","depth":27,"bounds":{"left":0.033909574,"top":0.5139665,"width":0.07712766,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.51476455,"width":0.0039893617,"height":0.011971269}},{"char_start":1,"char_count":34,"bounds":{"left":0.037898935,"top":0.51476455,"width":0.07347074,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.52992815,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MatchActivityCrmData.php","depth":27,"bounds":{"left":0.033909574,"top":0.53152436,"width":0.054521278,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.5323224,"width":0.0039893617,"height":0.011971269}},{"char_start":1,"char_count":23,"bounds":{"left":0.037898935,"top":0.5323224,"width":0.050531916,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"M","depth":27,"bounds":{"left":0.10638298,"top":0.5323224,"width":0.003656915,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.547486,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"NoteObject.php","depth":27,"bounds":{"left":0.033909574,"top":0.5490822,"width":0.031914894,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.54988027,"width":0.0033244682,"height":0.011971269}},{"char_start":1,"char_count":13,"bounds":{"left":0.03723404,"top":0.54988027,"width":0.028922873,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.56504387,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SaveActivity.php","depth":27,"bounds":{"left":0.033909574,"top":0.5666401,"width":0.03324468,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.5674381,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":15,"bounds":{"left":0.03656915,"top":0.5674381,"width":0.030585106,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.5826017,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SaveTranscription.php","depth":27,"bounds":{"left":0.033909574,"top":0.58419794,"width":0.04454787,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.584996,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":20,"bounds":{"left":0.03656915,"top":0.584996,"width":0.042220745,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.60015965,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SetupLayout.php","depth":27,"bounds":{"left":0.033909574,"top":0.6017558,"width":0.034242023,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.60255384,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":14,"bounds":{"left":0.03656915,"top":0.60255384,"width":0.031914894,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.6177175,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SyncActivity.php","depth":27,"bounds":{"left":0.033909574,"top":0.61931366,"width":0.03357713,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.6201117,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":15,"bounds":{"left":0.03656915,"top":0.6201117,"width":0.030917553,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.63527536,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SyncFieldMetadata.php","depth":27,"bounds":{"left":0.033909574,"top":0.6368715,"width":0.047539894,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.63766956,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":20,"bounds":{"left":0.03656915,"top":0.63766956,"width":0.04488032,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.6528332,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SyncHubspotObjects.php","depth":27,"bounds":{"left":0.033909574,"top":0.6544294,"width":0.051861703,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.6552275,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":21,"bounds":{"left":0.03656915,"top":0.6552275,"width":0.04920213,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.6703911,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SyncLeads.php","depth":27,"bounds":{"left":0.033909574,"top":0.67198724,"width":0.030917553,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.67278534,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":12,"bounds":{"left":0.03656915,"top":0.67278534,"width":0.02825798,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.68794894,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SyncObjects.php","depth":27,"bounds":{"left":0.033909574,"top":0.6895451,"width":0.034574468,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.6903432,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":14,"bounds":{"left":0.03656915,"top":0.6903432,"width":0.031914894,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.7055068,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SyncOpportunitiesJob.php","depth":27,"bounds":{"left":0.033909574,"top":0.70710295,"width":0.053856384,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.70790106,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":23,"bounds":{"left":0.03656915,"top":0.70790106,"width":0.05119681,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.72306466,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SyncOpportunity.php","depth":27,"bounds":{"left":0.033909574,"top":0.7246608,"width":0.04288564,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.7254589,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":18,"bounds":{"left":0.03656915,"top":0.7254589,"width":0.040226065,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.7406225,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SyncProfileMetadata.php","depth":27,"bounds":{"left":0.033909574,"top":0.7422187,"width":0.05086436,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.033909574,"top":0.7430168,"width":0.0026595744,"height":0.011971269}},{"char_start":1,"char_count":22,"bounds":{"left":0.03656915,"top":0.7430168,"width":0.048204787,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.7581804,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SyncTeamFieldsJob.php","depth":27,"bounds":{"left":0.033909574,"top":0.75977653,"width":0.04886968,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.77573824,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SyncTeamMetadata.php","depth":27,"bounds":{"left":0.033909574,"top":0.7773344,"width":0.048537236,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.7932961,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"UpdateOpportunitySpecifications.php","depth":27,"bounds":{"left":0.033909574,"top":0.79489225,"width":0.076130316,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.81085396,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"UpdateStage.php","depth":27,"bounds":{"left":0.033909574,"top":0.8124501,"width":0.03523936,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.024933511,"top":0.830008,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"DealRisks","depth":27,"bounds":{"left":0.03125,"top":0.830008,"width":0.019614361,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.024933511,"top":0.8475658,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Mailbox","depth":27,"bounds":{"left":0.03125,"top":0.8475658,"width":0.015625,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.024933511,"top":0.8651237,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MeetingBot","depth":27,"bounds":{"left":0.03125,"top":0.8651237,"width":0.023271276,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.024933511,"top":0.88268155,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Middleware","depth":27,"bounds":{"left":0.03125,"top":0.88268155,"width":0.023271276,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.10605053,"top":0.88347965,"width":0.004654255,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.89864326,"width":0.0063164895,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"HandleHubspotRateLimit.php","depth":27,"bounds":{"left":0.033909574,"top":0.9002394,"width":0.059175532,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"M","depth":27,"bounds":{"left":0.10638298,"top":0.9010375,"width":0.003656915,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.026595745,"top":0.9162011,"width":0.0063164895,"height":0.013567438},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"RateLimited.php","depth":27,"bounds":{"left":0.033909574,"top":0.91779727,"width":0.032912236,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.022273935,"top":0.11332801,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Jobs","depth":27,"bounds":{"left":0.028590426,"top":0.11332801,"width":0.009640957,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.10605053,"top":0.11412609,"width":0.004654255,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":26,"bounds":{"left":0.019614361,"top":0.09577015,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"app","depth":27,"bounds":{"left":0.025930852,"top":0.09577015,"width":0.0076462766,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.10605053,"top":0.096568234,"width":0.004654255,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Outline Section","depth":21,"bounds":{"left":0.015957447,"top":0.92976856,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.9321628,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"OUTLINE","depth":22,"bounds":{"left":0.022606382,"top":0.92976856,"width":0.01662234,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"OUTLINE","depth":23,"bounds":{"left":0.022606382,"top":0.933759,"width":0.01662234,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Timeline Section","depth":21,"bounds":{"left":0.015957447,"top":0.9473264,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.9497207,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"TIMELINE","depth":22,"bounds":{"left":0.022606382,"top":0.9473264,"width":0.01761968,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"TIMELINE","depth":23,"bounds":{"left":0.022606382,"top":0.95131683,"width":0.01761968,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"MySQL Section","depth":21,"bounds":{"left":0.015957447,"top":0.9648843,"width":0.09940159,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.01662234,"top":0.96727854,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXHeading","text":"MYSQL","depth":22,"bounds":{"left":0.022606382,"top":0.9648843,"width":0.013297873,"height":0.017557861},"on_screen":true,"role_description":"heading"},{"role":"AXStaticText","text":"MYSQL","depth":23,"bounds":{"left":0.022606382,"top":0.9688747,"width":0.013297873,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"MatchActivityCrmData.php, Editor Group 1","depth":28,"bounds":{"left":0.11569149,"top":0.047885075,"width":0.07978723,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"RateLimitException.php, Editor Group 1","depth":28,"bounds":{"left":0.19547872,"top":0.047885075,"width":0.0731383,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"HandleHubspotRateLimit.php, Editor Group 1","depth":28,"bounds":{"left":0.2682846,"top":0.047885075,"width":0.08510638,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Client.php, Editor Group 1","depth":28,"bounds":{"left":0.35339096,"top":0.047885075,"width":0.05086436,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"HubspotPaginationService.php, Editor Group 1","depth":28,"bounds":{"left":0.40425533,"top":0.047885075,"width":0.087765954,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":29,"bounds":{"left":0.12832446,"top":0.07821229,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":29,"bounds":{"left":0.14328457,"top":0.07821229,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":29,"bounds":{"left":0.15724733,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":29,"bounds":{"left":0.2244016,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":29,"bounds":{"left":0.22972074,"top":0.07821229,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm;\n\nuse Exception;\nuse Illuminate\\Contracts\\Queue\\ShouldBeUnique;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Database\\Connection;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue\\Constants;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Jobs\\Middleware\\HandleHubspotRateLimit;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\ActivityRepository;\nuse Jiminny\\Services\\Crm\\CrmActivityService;\nuse Psr\\Container\\ContainerExceptionInterface;\nuse Psr\\Container\\NotFoundExceptionInterface;\nuse Throwable;\n\nclass MatchActivityCrmData extends Job implements ShouldQueue, ShouldBeUnique\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n public int $maxExceptions = 3;\n\n private const int RETRY_WINDOW_MINUTES = 120;\n\n private int $activityId;\n private ?Configuration $fromConfiguration;\n private bool $remoteSearch;\n\n public function middleware(): array\n {\n return [new HandleHubspotRateLimit()];\n }\n\n public function retryUntil(): \\DateTimeInterface\n {\n return now()->addMinutes(self::RETRY_WINDOW_MINUTES);\n }\n\n public function __construct(\n int $activityId,\n ?Configuration $fromConfiguration = null,\n bool $remoteSearch = false,\n ) {\n $this->activityId = $activityId;\n $this->fromConfiguration = $fromConfiguration;\n $this->remoteSearch = $remoteSearch;\n\n $this->onQueue(Constants::QUEUE_ANALYTICS_LOW);\n }\n\n public function uniqueId(): string\n {\n $configId = $this->fromConfiguration?->getId() ?? 0;\n $remote = $this->remoteSearch ? 'remote' : 'local';\n\n return \"$this->activityId:$configId:$remote\";\n }\n\n public function timeout(): int\n {\n return 300; // 5 minutes max execution time\n }\n\n public function uniqueFor(): int\n {\n return self::RETRY_WINDOW_MINUTES * 60 + 60;\n }\n\n public function backoff(): array\n {\n return [30, 90, 180];\n }\n\n /**\n * @throws ContainerExceptionInterface\n * @throws NotFoundExceptionInterface\n * @throws Exception|Throwable\n */\n public function handle(\n ActivityRepository $activityRepository,\n CrmActivityService $crmActivityService,\n Connection $connection,\n ): void {\n $activity = $activityRepository->findById($this->activityId);\n if ($activity === null) {\n throw new InvalidArgumentException('[MatchActivityCrmData] Cannot find activity.');\n }\n\n try {\n $connection->transaction(function () use ($activity, $crmActivityService, $activityRepository) {\n Log::info('[MatchActivityCrmData] Starting CRM data matching', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n 'set_configuration' => $this->fromConfiguration?->getId(),\n 'old_state' => [\n 'lead_id' => $activity->getLead()?->getId(),\n 'contact_id' => $activity->getContact()?->getId(),\n 'account_id' => $activity->getAccount()?->getId(),\n 'opportunity_id' => $activity->getOpportunity()?->getId(),\n 'stage_id' => $activity->getStage()?->getId(),\n ],\n ]);\n\n $this->resetCrmMappings($activity, $activityRepository);\n\n $this->switchCrmConfigurationIfNeeded($activity);\n\n $activity->refresh();\n\n $crmActivityService->updateCrmData(\n activity: $activity,\n remoteSearch: $this->remoteSearch,\n );\n\n $hasMatch = $activity->getLead() !== null\n || $activity->getContact() !== null\n || $activity->getAccount() !== null\n || $activity->getOpportunity() !== null;\n\n if ($hasMatch) {\n Log::info('[MatchActivityCrmData] Successfully matched CRM data', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n 'lead_id' => $activity->getLead()?->getId(),\n 'contact_id' => $activity->getContact()?->getId(),\n 'account_id' => $activity->getAccount()?->getId(),\n 'opportunity_id' => $activity->getOpportunity()?->getId(),\n 'stage_id' => $activity->getStage()?->getId(),\n ]);\n } else {\n Log::info('[MatchActivityCrmData] No CRM match found', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n ]);\n }\n });\n } catch (Throwable $e) {\n if (! $e instanceof RateLimitException) {\n Log::error('[MatchActivityCrmData] Failed to match CRM data', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n 'exception' => $e->getMessage(),\n 'trace' => $e->getTraceAsString(),\n ]);\n }\n\n throw $e;\n }\n }\n\n public function failed(Throwable $exception): void\n {\n Log::error('[MatchActivityCrmData] Job permanently failed after all retries', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n 'from_configuration' => $this->fromConfiguration?->getId(),\n 'exception' => $exception->getMessage(),\n 'attempts' => $this->attempts(),\n ]);\n }\n\n private function resetCrmMappings(\n Activity $activity,\n ActivityRepository $activityRepository\n ): void {\n $activity->update([\n 'lead_id' => null,\n 'contact_id' => null,\n 'account_id' => null,\n 'opportunity_id' => null,\n 'stage_id' => null,\n ]);\n\n $participantsOldState = $activityRepository->getActivityParticipants($activity)\n ->map(function ($participant) {\n return [\n 'id' => $participant->id,\n 'user_id' => $participant->user_id,\n 'contact_id' => $participant->contact_id,\n 'lead_id' => $participant->lead_id,\n ];\n });\n\n if ($participantsOldState->isNotEmpty()) {\n Log::info('[MatchActivityCrmData] Participants old state', [\n 'activity' => $this->activityId,\n 'participants' => $participantsOldState->toArray(),\n ]);\n }\n\n $activity->participants()->update([\n 'user_id' => null,\n 'contact_id' => null,\n 'lead_id' => null,\n ]);\n }\n\n private function switchCrmConfigurationIfNeeded(Activity $activity): void\n {\n if ($this->fromConfiguration === null) {\n return;\n }\n\n if ($activity->getCrm()?->getId() === $this->fromConfiguration->getId()) {\n return;\n }\n\n Log::info('[MatchActivityCrmData] Switching CRM configuration', [\n 'activity' => $this->activityId,\n 'old_configuration' => $activity->getCrm()?->getId(),\n 'new_configuration' => $this->fromConfiguration->getId(),\n ]);\n\n $activity->update([\n 'crm_configuration_id' => $this->fromConfiguration->getId(),\n 'crm_provider_id' => null,\n ]);\n }\n}","depth":28,"bounds":{"left":0.13763298,"top":0.47885075,"width":0.25964096,"height":0.014365523},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm;\n\nuse Exception;\nuse Illuminate\\Contracts\\Queue\\ShouldBeUnique;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Database\\Connection;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue\\Constants;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Jobs\\Middleware\\HandleHubspotRateLimit;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\ActivityRepository;\nuse Jiminny\\Services\\Crm\\CrmActivityService;\nuse Psr\\Container\\ContainerExceptionInterface;\nuse Psr\\Container\\NotFoundExceptionInterface;\nuse Throwable;\n\nclass MatchActivityCrmData extends Job implements ShouldQueue, ShouldBeUnique\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n public int $maxExceptions = 3;\n\n private const int RETRY_WINDOW_MINUTES = 120;\n\n private int $activityId;\n private ?Configuration $fromConfiguration;\n private bool $remoteSearch;\n\n public function middleware(): array\n {\n return [new HandleHubspotRateLimit()];\n }\n\n public function retryUntil(): \\DateTimeInterface\n {\n return now()->addMinutes(self::RETRY_WINDOW_MINUTES);\n }\n\n public function __construct(\n int $activityId,\n ?Configuration $fromConfiguration = null,\n bool $remoteSearch = false,\n ) {\n $this->activityId = $activityId;\n $this->fromConfiguration = $fromConfiguration;\n $this->remoteSearch = $remoteSearch;\n\n $this->onQueue(Constants::QUEUE_ANALYTICS_LOW);\n }\n\n public function uniqueId(): string\n {\n $configId = $this->fromConfiguration?->getId() ?? 0;\n $remote = $this->remoteSearch ? 'remote' : 'local';\n\n return \"$this->activityId:$configId:$remote\";\n }\n\n public function timeout(): int\n {\n return 300; // 5 minutes max execution time\n }\n\n public function uniqueFor(): int\n {\n return self::RETRY_WINDOW_MINUTES * 60 + 60;\n }\n\n public function backoff(): array\n {\n return [30, 90, 180];\n }\n\n /**\n * @throws ContainerExceptionInterface\n * @throws NotFoundExceptionInterface\n * @throws Exception|Throwable\n */\n public function handle(\n ActivityRepository $activityRepository,\n CrmActivityService $crmActivityService,\n Connection $connection,\n ): void {\n $activity = $activityRepository->findById($this->activityId);\n if ($activity === null) {\n throw new InvalidArgumentException('[MatchActivityCrmData] Cannot find activity.');\n }\n\n try {\n $connection->transaction(function () use ($activity, $crmActivityService, $activityRepository) {\n Log::info('[MatchActivityCrmData] Starting CRM data matching', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n 'set_configuration' => $this->fromConfiguration?->getId(),\n 'old_state' => [\n 'lead_id' => $activity->getLead()?->getId(),\n 'contact_id' => $activity->getContact()?->getId(),\n 'account_id' => $activity->getAccount()?->getId(),\n 'opportunity_id' => $activity->getOpportunity()?->getId(),\n 'stage_id' => $activity->getStage()?->getId(),\n ],\n ]);\n\n $this->resetCrmMappings($activity, $activityRepository);\n\n $this->switchCrmConfigurationIfNeeded($activity);\n\n $activity->refresh();\n\n $crmActivityService->updateCrmData(\n activity: $activity,\n remoteSearch: $this->remoteSearch,\n );\n\n $hasMatch = $activity->getLead() !== null\n || $activity->getContact() !== null\n || $activity->getAccount() !== null\n || $activity->getOpportunity() !== null;\n\n if ($hasMatch) {\n Log::info('[MatchActivityCrmData] Successfully matched CRM data', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n 'lead_id' => $activity->getLead()?->getId(),\n 'contact_id' => $activity->getContact()?->getId(),\n 'account_id' => $activity->getAccount()?->getId(),\n 'opportunity_id' => $activity->getOpportunity()?->getId(),\n 'stage_id' => $activity->getStage()?->getId(),\n ]);\n } else {\n Log::info('[MatchActivityCrmData] No CRM match found', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n ]);\n }\n });\n } catch (Throwable $e) {\n if (! $e instanceof RateLimitException) {\n Log::error('[MatchActivityCrmData] Failed to match CRM data', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n 'exception' => $e->getMessage(),\n 'trace' => $e->getTraceAsString(),\n ]);\n }\n\n throw $e;\n }\n }\n\n public function failed(Throwable $exception): void\n {\n Log::error('[MatchActivityCrmData] Job permanently failed after all retries', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n 'from_configuration' => $this->fromConfiguration?->getId(),\n 'exception' => $exception->getMessage(),\n 'attempts' => $this->attempts(),\n ]);\n }\n\n private function resetCrmMappings(\n Activity $activity,\n ActivityRepository $activityRepository\n ): void {\n $activity->update([\n 'lead_id' => null,\n 'contact_id' => null,\n 'account_id' => null,\n 'opportunity_id' => null,\n 'stage_id' => null,\n ]);\n\n $participantsOldState = $activityRepository->getActivityParticipants($activity)\n ->map(function ($participant) {\n return [\n 'id' => $participant->id,\n 'user_id' => $participant->user_id,\n 'contact_id' => $participant->contact_id,\n 'lead_id' => $participant->lead_id,\n ];\n });\n\n if ($participantsOldState->isNotEmpty()) {\n Log::info('[MatchActivityCrmData] Participants old state', [\n 'activity' => $this->activityId,\n 'participants' => $participantsOldState->toArray(),\n ]);\n }\n\n $activity->participants()->update([\n 'user_id' => null,\n 'contact_id' => null,\n 'lead_id' => null,\n ]);\n }\n\n private function switchCrmConfigurationIfNeeded(Activity $activity): void\n {\n if ($this->fromConfiguration === null) {\n return;\n }\n\n if ($activity->getCrm()?->getId() === $this->fromConfiguration->getId()) {\n return;\n }\n\n Log::info('[MatchActivityCrmData] Switching CRM configuration', [\n 'activity' => $this->activityId,\n 'old_configuration' => $activity->getCrm()?->getId(),\n 'new_configuration' => $this->fromConfiguration->getId(),\n ]);\n\n $activity->update([\n 'crm_configuration_id' => $this->fromConfiguration->getId(),\n 'crm_provider_id' => null,\n ]);\n }\n}","role_description":"editor","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Jobs\\Crm;\n\nuse Exception;\nuse Illuminate\\Contracts\\Queue\\ShouldBeUnique;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Database\\Connection;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Component\\Queue\\Constants;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Jobs\\Job;\nuse Jiminny\\Jobs\\Middleware\\HandleHubspotRateLimit;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\ActivityRepository;\nuse Jiminny\\Services\\Crm\\CrmActivityService;\nuse Psr\\Container\\ContainerExceptionInterface;\nuse Psr\\Container\\NotFoundExceptionInterface;\nuse Throwable;\n\nclass MatchActivityCrmData extends Job implements ShouldQueue, ShouldBeUnique\n{\n use InteractsWithQueue;\n use SerializesModels;\n\n public int $maxExceptions = 3;\n\n private const int RETRY_WINDOW_MINUTES = 120;\n\n private int $activityId;\n private ?Configuration $fromConfiguration;\n private bool $remoteSearch;\n\n public function middleware(): array\n {\n return [new HandleHubspotRateLimit()];\n }\n\n public function retryUntil(): \\DateTimeInterface\n {\n return now()->addMinutes(self::RETRY_WINDOW_MINUTES);\n }\n\n public function __construct(\n int $activityId,\n ?Configuration $fromConfiguration = null,\n bool $remoteSearch = false,\n ) {\n $this->activityId = $activityId;\n $this->fromConfiguration = $fromConfiguration;\n $this->remoteSearch = $remoteSearch;\n\n $this->onQueue(Constants::QUEUE_ANALYTICS_LOW);\n }\n\n public function uniqueId(): string\n {\n $configId = $this->fromConfiguration?->getId() ?? 0;\n $remote = $this->remoteSearch ? 'remote' : 'local';\n\n return \"$this->activityId:$configId:$remote\";\n }\n\n public function timeout(): int\n {\n return 300; // 5 minutes max execution time\n }\n\n public function uniqueFor(): int\n {\n return self::RETRY_WINDOW_MINUTES * 60 + 60;\n }\n\n public function backoff(): array\n {\n return [30, 90, 180];\n }\n\n /**\n * @throws ContainerExceptionInterface\n * @throws NotFoundExceptionInterface\n * @throws Exception|Throwable\n */\n public function handle(\n ActivityRepository $activityRepository,\n CrmActivityService $crmActivityService,\n Connection $connection,\n ): void {\n $activity = $activityRepository->findById($this->activityId);\n if ($activity === null) {\n throw new InvalidArgumentException('[MatchActivityCrmData] Cannot find activity.');\n }\n\n try {\n $connection->transaction(function () use ($activity, $crmActivityService, $activityRepository) {\n Log::info('[MatchActivityCrmData] Starting CRM data matching', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n 'set_configuration' => $this->fromConfiguration?->getId(),\n 'old_state' => [\n 'lead_id' => $activity->getLead()?->getId(),\n 'contact_id' => $activity->getContact()?->getId(),\n 'account_id' => $activity->getAccount()?->getId(),\n 'opportunity_id' => $activity->getOpportunity()?->getId(),\n 'stage_id' => $activity->getStage()?->getId(),\n ],\n ]);\n\n $this->resetCrmMappings($activity, $activityRepository);\n\n $this->switchCrmConfigurationIfNeeded($activity);\n\n $activity->refresh();\n\n $crmActivityService->updateCrmData(\n activity: $activity,\n remoteSearch: $this->remoteSearch,\n );\n\n $hasMatch = $activity->getLead() !== null\n || $activity->getContact() !== null\n || $activity->getAccount() !== null\n || $activity->getOpportunity() !== null;\n\n if ($hasMatch) {\n Log::info('[MatchActivityCrmData] Successfully matched CRM data', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n 'lead_id' => $activity->getLead()?->getId(),\n 'contact_id' => $activity->getContact()?->getId(),\n 'account_id' => $activity->getAccount()?->getId(),\n 'opportunity_id' => $activity->getOpportunity()?->getId(),\n 'stage_id' => $activity->getStage()?->getId(),\n ]);\n } else {\n Log::info('[MatchActivityCrmData] No CRM match found', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n ]);\n }\n });\n } catch (Throwable $e) {\n if (! $e instanceof RateLimitException) {\n Log::error('[MatchActivityCrmData] Failed to match CRM data', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n 'exception' => $e->getMessage(),\n 'trace' => $e->getTraceAsString(),\n ]);\n }\n\n throw $e;\n }\n }\n\n public function failed(Throwable $exception): void\n {\n Log::error('[MatchActivityCrmData] Job permanently failed after all retries', [\n 'activity' => $this->activityId,\n 'remote_search' => $this->remoteSearch,\n 'from_configuration' => $this->fromConfiguration?->getId(),\n 'exception' => $exception->getMessage(),\n 'attempts' => $this->attempts(),\n ]);\n }\n\n private function resetCrmMappings(\n Activity $activity,\n ActivityRepository $activityRepository\n ): void {\n $activity->update([\n 'lead_id' => null,\n 'contact_id' => null,\n 'account_id' => null,\n 'opportunity_id' => null,\n 'stage_id' => null,\n ]);\n\n $participantsOldState = $activityRepository->getActivityParticipants($activity)\n ->map(function ($participant) {\n return [\n 'id' => $participant->id,\n 'user_id' => $participant->user_id,\n 'contact_id' => $participant->contact_id,\n 'lead_id' => $participant->lead_id,\n ];\n });\n\n if ($participantsOldState->isNotEmpty()) {\n Log::info('[MatchActivityCrmData] Participants old state', [\n 'activity' => $this->activityId,\n 'participants' => $participantsOldState->toArray(),\n ]);\n }\n\n $activity->participants()->update([\n 'user_id' => null,\n 'contact_id' => null,\n 'lead_id' => null,\n ]);\n }\n\n private function switchCrmConfigurationIfNeeded(Activity $activity): void\n {\n if ($this->fromConfiguration === null) {\n return;\n }\n\n if ($activity->getCrm()?->getId() === $this->fromConfiguration->getId()) {\n return;\n }\n\n Log::info('[MatchActivityCrmData] Switching CRM configuration', [\n 'activity' => $this->activityId,\n 'old_configuration' => $activity->getCrm()?->getId(),\n 'new_configuration' => $this->fromConfiguration->getId(),\n ]);\n\n $activity->update([\n 'crm_configuration_id' => $this->fromConfiguration->getId(),\n 'crm_provider_id' => null,\n ]);\n }\n}","depth":29,"bounds":{"left":0.13763298,"top":0.47885075,"width":0.25964096,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Review rate limit handli…, Editor Group 2","depth":28,"bounds":{"left":0.5578458,"top":0.047885075,"width":0.07014628,"height":0.02793296},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXButton","text":"remote","depth":16,"bounds":{"left":0.0006648936,"top":0.98244214,"width":0.010638298,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"app (Git) - JY-20725-handle-HS-search-rate-limit*+, Checkout Branch/Tag...","depth":16,"bounds":{"left":0.012965426,"top":0.98244214,"width":0.087101065,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.013962766,"top":0.9848364,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"JY-20725-handle-HS-search-rate-limit*+","depth":17,"bounds":{"left":0.019281914,"top":0.9856345,"width":0.07978723,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"app (Git) - Publish Branch","depth":16,"bounds":{"left":0.10006649,"top":0.98244214,"width":0.00731383,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Errors: 6, Warnings: 9, Infos: 2","depth":16,"bounds":{"left":0.1100399,"top":0.98244214,"width":0.032579787,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.11170213,"top":0.9848364,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"6","depth":17,"bounds":{"left":0.11702128,"top":0.9856345,"width":0.004986702,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.12167553,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"9","depth":17,"bounds":{"left":0.12699468,"top":0.9856345,"width":0.004986702,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.13164894,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":17,"bounds":{"left":0.13696809,"top":0.9856345,"width":0.0039893617,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Notifications","depth":16,"bounds":{"left":0.9886968,"top":0.98244214,"width":0.010638298,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"key, PHP extension: Premium features not active.","depth":16,"bounds":{"left":0.9790558,"top":0.98244214,"width":0.008643617,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sign In","depth":16,"bounds":{"left":0.9544548,"top":0.98244214,"width":0.022606382,"height":0.01755786},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":17,"bounds":{"left":0.95611703,"top":0.9848364,"width":0.0056515955,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Sign In","depth":17,"bounds":{"left":0.96143615,"top":0.9856345,"width":0.013962766,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Info: You have Docker installed on your system. Do you want to install the recommended extensions from Microsoft for it?","depth":12,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Clear","depth":12,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Review rate limit handling for HubSpot job queue","depth":19,"bounds":{"left":0.56017286,"top":0.08060654,"width":0.099734046,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Session history","depth":19,"bounds":{"left":0.9780585,"top":0.08060654,"width":0.00930851,"height":0.022346368},"on_screen":true,"help_text":"Session history","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New session","depth":19,"bounds":{"left":0.9886968,"top":0.08060654,"width":0.00930851,"height":0.022346368},"on_screen":true,"help_text":"New session","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Message actions","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RateLimitException.php#9-9","depth":23,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"RateLimitException.php#9-9","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Reveiw the diff. Mostly","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"@app/Jobs/Crm/MatchActivityCrmData.php","depth":26,"on_screen":false,"help_text":"Open app/Jobs/Crm/MatchActivityCrmData.php","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":",","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"@app/Exceptions/RateLimitException.php","depth":26,"on_screen":false,"help_text":"Open app/Exceptions/RateLimitException.php","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":",","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"@app/Jobs/Middleware/HandleHubspotRateLimit.php","depth":26,"on_screen":false,"help_text":"Open app/Jobs/Middleware/HandleHubspotRateLimit.php","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":",","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"@app/Services/Crm/Hubspot/Client.php","depth":26,"on_screen":false,"help_text":"Open app/Services/Crm/Hubspot/Client.php","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"and","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"@app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php","depth":26,"on_screen":false,"help_text":"Open app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":". The issue is I am trying to make sure that instant spike of MatchActivityCrmData jobs willl handle 429 exceptions from hubspot. Revewi ti carefully and try to see potential issues and bottlenecks. Also RateLimitException was changerd from LogicException to RuntimeException. Is it ok. This exception is used by other paerts of code. Will ti break anything?","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thought for 5s","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thought for 5s","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"I'll review the implementation carefully. Let me first check how","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"RateLimitException","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"is used elsewhere and look at the test files and","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PaginationState","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Find all usages of RateLimitException outside the changed files","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -rn \"RateLimitException\" /Users/lukas/jiminny/app/app --include=\"*.php\" | grep -v \"HandleHubspotRateLimit\\|MatchActivityCrmData\\|Client.php\\|RateLimitException.php\"","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:13:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception\n/Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php:17:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php:68: RateLimitException |\n/Users/lukas/jiminny/app/app/Component/TranscriptionSummary/Jobs/SummarizeTranscriptionJob.php:15:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/app/Component/TranscriptionSummary/Jobs/SummarizeTranscriptionJob.php:58: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception\n/Users/lukas/jiminny/app/app/Component/AiActivityType/Jobs/GenerateAiActivityTypeJob.php:19:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/app/Component/AiActivityType/Jobs/GenerateAiActivityTypeJob.php:76: RateLimitException |\n/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/HubspotClientInterface.php:8:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/HubspotClientInterface.php:50: * @throws RateLimitException When rate limit is hit\n/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php:195: // RateLimitException and other exceptions are re-thrown as-is","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"PaginationState.php","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"PaginationState.php","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"HandleHubspotRateLimitTest.php","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"HandleHubspotRateLimitTest.php","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Check how RateLimitException is used in GenerateActionItemsJob","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -rn \"RateLimitException\\|LogicException\\|RuntimeException\" /Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php | head -20","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:13:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Find all catch blocks or instanceof checks for RateLimitException","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -rn \"catch.*RateLimitException\\|instanceof RateLimitException\" /Users/lukas/jiminny/app/app --include=\"*.php\"","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/Users/lukas/jiminny/app/app/Jobs/Middleware/HandleHubspotRateLimit.php:11: * Job middleware that catches RateLimitException from HubSpot API calls\n/Users/lukas/jiminny/app/app/Jobs/Middleware/HandleHubspotRateLimit.php:24: } catch (RateLimitException $e) {\n/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:149: if (! $e instanceof RateLimitException) {","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Find all test references to RateLimitException","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -rn \"RateLimitException\" /Users/lukas/jiminny/app/tests --include=\"*.php\"","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:8:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:13:#[CoversClass(RateLimitException::class)]\n/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:14:class RateLimitExceptionTest extends TestCase\n/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:18: $exception = new RateLimitException();\n/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:28: $exception = new RateLimitException('Hubspot rate limit', 30, $previous);\n/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:52: $exception = new RateLimitException('test', $input);\n/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:10:use Jiminny\\Exceptions\\RateLimitException;\n/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:49: public function testPropagatesNonRateLimitExceptions(): void\n/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:103: throw new RateLimitException('rate limited', $retryAfter);\n/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:150: throw new RateLimitException('rate limited', 1);","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Check retry/failure handling in GenerateActionItemsJob","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"RateLimitException\\|retryUntil\\|backoff\\|maxExceptions\\|maxTries\\|release\\|failed\" /Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php | head -30","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"13:use Jiminny\\Exceptions\\RateLimitException;\n51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception\n56: $this->release(30);","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Check retry/failure handling in GenerateAiCallScoringJob","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"RateLimitException\\|retryUntil\\|backoff\\|maxExceptions\\|maxTries\\|release\\|failed\" /Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php | head -30","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"17:use Jiminny\\Exceptions\\RateLimitException;\n68: RateLimitException |\n75: $this->release(30);","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Check retry config in MatchActivityCrmData","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"retryAfter\\|RETRY_WINDOW\\|retryUntil\\|maxTries\" /Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"34: private const int RETRY_WINDOW_MINUTES = 30;\n45: public function retryUntil(): \\DateTimeInterface\n47: return now()->addMinutes(self::RETRY_WINDOW_MINUTES);\n77: return self::RETRY_WINDOW_MINUTES * 60 + 60;","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Check the cache key format","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -n \"getRateLimitCacheKey\\|hubspot:ratelimit\" /Users/lukas/jiminny/app/app/Services/Crm/Hubspot/Client.php","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"78: $cacheKey = $this->getRateLimitCacheKey();\n110: private function getRateLimitCacheKey(): string\n112: return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Bash","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Find other jobs that might use the rate limit middleware","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IN","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"grep -rn \"class.*Middleware\\|HandleHubspotRateLimit\" /Users/lukas/jiminny/app/app/Jobs --include=\"*.php\" | grep -v \"HandleHubspotRateLimit.php\"","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":24,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"OUT","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:18:use Jiminny\\Jobs\\Middleware\\HandleHubspotRateLimit;\n/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:42: return [new HandleHubspotRateLimit()];","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Read","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"HubspotClientInterface.php","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"HubspotClientInterface.php","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thought for 73s","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thought for 73s","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Now I have a complete picture. Here's my full analysis:","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Review Summary","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Review Summary","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"RuntimeException vs LogicException — Safe ✓","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"RuntimeException","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"vs","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"LogicException","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"— Safe ✓","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"The change is semantically correct and won't break anything.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"LogicException","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"is for programmer errors (invalid arguments, contract violations). A rate limit from an external API is a runtime condition —","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"RuntimeException","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"is the right parent. All callers catch","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"RateLimitException","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"by name explicitly (union catches in","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"GenerateActionItemsJob","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"GenerateAiCallScoringJob","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SummarizeTranscriptionJob","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"GenerateAiActivityTypeJob","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":") or check","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"instanceof RateLimitException","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"— none relies on the parent class type, so nothing breaks.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Issue 1 — Circuit breaker stores stale delay (most important bug)","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Issue 1 — Circuit breaker stores stale delay (most important bug)","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Client.php:94","depth":23,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Client.php:94","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"The TTL is","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"$retryAfter","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"seconds, but the","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"stored value","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"is also the original","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"$retryAfter","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":". If a second job reads this cache 20 seconds later, it throws","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"RateLimitException(retryAfter=30)","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"and gets delayed 30 more seconds — even though only 10 remain. In a spike of 100 jobs, each subsequent job inflates its wait.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Fix:","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"store the absolute expiry timestamp, reconstruct the remaining delay when reading:","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"// on 429:\nRedis::setex($cacheKey, $retryAfter, (string) (time() + $retryAfter));\n\n// in the cached-read branch:\n$remaining = max(1, (int) $cachedRetryAfter - time());\nthrow new RateLimitException('Hubspot rate limit (cached circuit-breaker)', $remaining);","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Issue 2 — retryUntil() window may expire under sustained rate limiting","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Issue 2 —","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"retryUntil()","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"window may expire under sustained rate limiting","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"MatchActivityCrmData.php:45-47","depth":23,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"MatchActivityCrmData.php:45-47","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"retryUntil()","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"is calculated as","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"now() + 30 min","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"at","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"dispatch time","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"and stored in the job payload. With","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MAX_RETRY_DELAY = 600s","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":", you only get ~3 rate-limit-triggered releases before the 30-minute window closes and the job is permanently failed. For a heavy 429 spike (daily limit, parsed as 600s), this can easily happen.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Consider increasing","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"RETRY_WINDOW_MINUTES","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"to 60 or more, or making it configurable. The","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"uniqueFor()","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"value should be updated to match.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Issue 3 — Only search() uses the circuit breaker, but other methods can still hit 429","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Issue 3 — Only","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"search()","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"uses the circuit breaker, but other methods can still hit 429","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Client.php:76-108","depth":23,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Client.php:76-108","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"executeRequest()","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"is only called from","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"search()","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":". Methods like","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"getOpportunityById()","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"batchReadObjects()","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"getContactByEmail()","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"bypass it entirely. If HubSpot's 429 is account-wide (not search-endpoint-specific), those methods will keep firing even while the circuit breaker is supposedly open. This is likely fine because the search endpoint has its own tighter quota (5 RPS), but it's worth being explicit in a comment.","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"Issue 4 — object $job type in middleware has no compile-time safety","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"Issue 4 —","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"object $job","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"type in middleware has no compile-time safety","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"HandleHubspotRateLimit.php:20","depth":23,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"HandleHubspotRateLimit.php:20","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Copy code to clipboard","depth":23,"on_screen":false,"help_text":"Copy code","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"public function handle(object $job, callable $next): void","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Calling","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"$job->attempts()","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"and","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"$job->release()","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"on","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"object","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"will work at runtime since Laravel always passes jobs that use","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"InteractsWithQueue","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":", but PHPStan/psalm won't verify this and it could silently break in tests with bare mocks (as your test does use a","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Job","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"mock that has","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"attempts()","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"— so the test is fine, but the real type contract is invisible). Minor, but worth tightening to","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"\\Illuminate\\Contracts\\Queue\\Job","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXHeading","text":"What works well ✓","depth":22,"on_screen":false,"role_description":"heading"},{"role":"AXStaticText","text":"What works well ✓","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"RateLimitException","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"is caught by the middleware","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"before","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"it increments","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"maxExceptions","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":", so rate-limit releases don't consume the 3-exception budget for real failures.","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"The middleware's jitter (","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"random_int(0, 5)","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":") prevents thundering herd on release.","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"The log-sampling logic (","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"attempts <= 3 || attempts % 10 === 0","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":") keeps logs useful without flooding.","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ShouldBeUnique","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"+","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"uniqueFor()","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"correctly prevents duplicate jobs queuing up during the rate-limit wait window.","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"RateLimitException","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"propagates cleanly through the DB transaction (rolled back), then through the job catch block (logged conditionally), then to the middleware which handles it.","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"The pagination service re-throws","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"RateLimitException","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"as-is and resets pagination state on the next job attempt — safe because offset restarts from 0.","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Message actions","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Expand on 1 and 2. Let's consider there are several jobs running from ten workers. They are out fired instantly, and therefore there is no cache when they look for cache, but once they receive 429, they store cache. Can there be some potential issues with that flow?","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Thought for 91s","depth":23,"on_screen":false,"role_description":"disclosure triangle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Thought for 91s","depth":24,"on_screen":false,"role_description":"text"}]...
|
-8011530741799445397
|
6665405806397064153
|
idle
|
accessibility
|
NULL
|
Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧ Explorer (⇧⌘E)
Search (⇧⌘F)
Source Control (⌃⇧G) - 22 pending changes
22
Run and Debug (⇧⌘D)
Remote Explorer
Extensions (⇧⌘X) - 2 require update
2
Testing
Claude Code
EXPLORER
EXPLORER
Explorer Section: app
Explorer Section: app
APP
AjReports
Audio
AutomatedReports
Calendar
Crm
Delete
Hubspot
Traits
FetchMergedObjectsPageJob.php
HubspotAppUninstallJob.php
ImportAccountBatch.php
ImportBatchJobTrait.php
ImportContactBatch.php
ImportOpportunityBatch.php
ProcessHubspotWebhookEventsTrait.php
ProcessInternalWebhookEventsJob.php
ProcessMergedObjectJob.php
ProcessWebhookEventsJob.php
UpdateDealWebhookSubscriptionJob.php
Salesforce
AutologDelayedToCrm.php
CheckAndRetryRemoteMatch.php
CreateFollowupActivity.php
CreateNotes.php
MatchActivitiesToNewOpportunity.php
MatchActivityCrmData.php
M
NoteObject.php
SaveActivity.php
SaveTranscription.php
SetupLayout.php
SyncActivity.php
SyncFieldMetadata.php
SyncHubspotObjects.php
SyncLeads.php
SyncObjects.php
SyncOpportunitiesJob.php
SyncOpportunity.php
SyncProfileMetadata.php
SyncTeamFieldsJob.php
SyncTeamMetadata.php
UpdateOpportunitySpecifications.php
UpdateStage.php
DealRisks
Mailbox
MeetingBot
Middleware
HandleHubspotRateLimit.php
M
RateLimited.php
Jobs
app
Outline Section
OUTLINE
OUTLINE
Timeline Section
TIMELINE
TIMELINE
MySQL Section
MYSQL
MYSQL
MatchActivityCrmData.php, Editor Group 1
RateLimitException.php, Editor Group 1
HandleHubspotRateLimit.php, Editor Group 1
Client.php, Editor Group 1
HubspotPaginationService.php, Editor Group 1
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm;
use Exception;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Database\Connection;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue\Constants;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Jobs\Job;
use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
use Jiminny\Models\Activity;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\ActivityRepository;
use Jiminny\Services\Crm\CrmActivityService;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Throwable;
class MatchActivityCrmData extends Job implements ShouldQueue, ShouldBeUnique
{
use InteractsWithQueue;
use SerializesModels;
public int $maxExceptions = 3;
private const int RETRY_WINDOW_MINUTES = 120;
private int $activityId;
private ?Configuration $fromConfiguration;
private bool $remoteSearch;
public function middleware(): array
{
return [new HandleHubspotRateLimit()];
}
public function retryUntil(): \DateTimeInterface
{
return now()->addMinutes(self::RETRY_WINDOW_MINUTES);
}
public function __construct(
int $activityId,
?Configuration $fromConfiguration = null,
bool $remoteSearch = false,
) {
$this->activityId = $activityId;
$this->fromConfiguration = $fromConfiguration;
$this->remoteSearch = $remoteSearch;
$this->onQueue(Constants::QUEUE_ANALYTICS_LOW);
}
public function uniqueId(): string
{
$configId = $this->fromConfiguration?->getId() ?? 0;
$remote = $this->remoteSearch ? 'remote' : 'local';
return "$this->activityId:$configId:$remote";
}
public function timeout(): int
{
return 300; // 5 minutes max execution time
}
public function uniqueFor(): int
{
return self::RETRY_WINDOW_MINUTES * 60 + 60;
}
public function backoff(): array
{
return [30, 90, 180];
}
/**
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws Exception|Throwable
*/
public function handle(
ActivityRepository $activityRepository,
CrmActivityService $crmActivityService,
Connection $connection,
): void {
$activity = $activityRepository->findById($this->activityId);
if ($activity === null) {
throw new InvalidArgumentException('[MatchActivityCrmData] Cannot find activity.');
}
try {
$connection->transaction(function () use ($activity, $crmActivityService, $activityRepository) {
Log::info('[MatchActivityCrmData] Starting CRM data matching', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'set_configuration' => $this->fromConfiguration?->getId(),
'old_state' => [
'lead_id' => $activity->getLead()?->getId(),
'contact_id' => $activity->getContact()?->getId(),
'account_id' => $activity->getAccount()?->getId(),
'opportunity_id' => $activity->getOpportunity()?->getId(),
'stage_id' => $activity->getStage()?->getId(),
],
]);
$this->resetCrmMappings($activity, $activityRepository);
$this->switchCrmConfigurationIfNeeded($activity);
$activity->refresh();
$crmActivityService->updateCrmData(
activity: $activity,
remoteSearch: $this->remoteSearch,
);
$hasMatch = $activity->getLead() !== null
|| $activity->getContact() !== null
|| $activity->getAccount() !== null
|| $activity->getOpportunity() !== null;
if ($hasMatch) {
Log::info('[MatchActivityCrmData] Successfully matched CRM data', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'lead_id' => $activity->getLead()?->getId(),
'contact_id' => $activity->getContact()?->getId(),
'account_id' => $activity->getAccount()?->getId(),
'opportunity_id' => $activity->getOpportunity()?->getId(),
'stage_id' => $activity->getStage()?->getId(),
]);
} else {
Log::info('[MatchActivityCrmData] No CRM match found', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
]);
}
});
} catch (Throwable $e) {
if (! $e instanceof RateLimitException) {
Log::error('[MatchActivityCrmData] Failed to match CRM data', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'exception' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
]);
}
throw $e;
}
}
public function failed(Throwable $exception): void
{
Log::error('[MatchActivityCrmData] Job permanently failed after all retries', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'from_configuration' => $this->fromConfiguration?->getId(),
'exception' => $exception->getMessage(),
'attempts' => $this->attempts(),
]);
}
private function resetCrmMappings(
Activity $activity,
ActivityRepository $activityRepository
): void {
$activity->update([
'lead_id' => null,
'contact_id' => null,
'account_id' => null,
'opportunity_id' => null,
'stage_id' => null,
]);
$participantsOldState = $activityRepository->getActivityParticipants($activity)
->map(function ($participant) {
return [
'id' => $participant->id,
'user_id' => $participant->user_id,
'contact_id' => $participant->contact_id,
'lead_id' => $participant->lead_id,
];
});
if ($participantsOldState->isNotEmpty()) {
Log::info('[MatchActivityCrmData] Participants old state', [
'activity' => $this->activityId,
'participants' => $participantsOldState->toArray(),
]);
}
$activity->participants()->update([
'user_id' => null,
'contact_id' => null,
'lead_id' => null,
]);
}
private function switchCrmConfigurationIfNeeded(Activity $activity): void
{
if ($this->fromConfiguration === null) {
return;
}
if ($activity->getCrm()?->getId() === $this->fromConfiguration->getId()) {
return;
}
Log::info('[MatchActivityCrmData] Switching CRM configuration', [
'activity' => $this->activityId,
'old_configuration' => $activity->getCrm()?->getId(),
'new_configuration' => $this->fromConfiguration->getId(),
]);
$activity->update([
'crm_configuration_id' => $this->fromConfiguration->getId(),
'crm_provider_id' => null,
]);
}
}
<?php
declare(strict_types=1);
namespace Jiminny\Jobs\Crm;
use Exception;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Database\Connection;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
use Jiminny\Component\Queue\Constants;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Jobs\Job;
use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
use Jiminny\Models\Activity;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\ActivityRepository;
use Jiminny\Services\Crm\CrmActivityService;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Throwable;
class MatchActivityCrmData extends Job implements ShouldQueue, ShouldBeUnique
{
use InteractsWithQueue;
use SerializesModels;
public int $maxExceptions = 3;
private const int RETRY_WINDOW_MINUTES = 120;
private int $activityId;
private ?Configuration $fromConfiguration;
private bool $remoteSearch;
public function middleware(): array
{
return [new HandleHubspotRateLimit()];
}
public function retryUntil(): \DateTimeInterface
{
return now()->addMinutes(self::RETRY_WINDOW_MINUTES);
}
public function __construct(
int $activityId,
?Configuration $fromConfiguration = null,
bool $remoteSearch = false,
) {
$this->activityId = $activityId;
$this->fromConfiguration = $fromConfiguration;
$this->remoteSearch = $remoteSearch;
$this->onQueue(Constants::QUEUE_ANALYTICS_LOW);
}
public function uniqueId(): string
{
$configId = $this->fromConfiguration?->getId() ?? 0;
$remote = $this->remoteSearch ? 'remote' : 'local';
return "$this->activityId:$configId:$remote";
}
public function timeout(): int
{
return 300; // 5 minutes max execution time
}
public function uniqueFor(): int
{
return self::RETRY_WINDOW_MINUTES * 60 + 60;
}
public function backoff(): array
{
return [30, 90, 180];
}
/**
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws Exception|Throwable
*/
public function handle(
ActivityRepository $activityRepository,
CrmActivityService $crmActivityService,
Connection $connection,
): void {
$activity = $activityRepository->findById($this->activityId);
if ($activity === null) {
throw new InvalidArgumentException('[MatchActivityCrmData] Cannot find activity.');
}
try {
$connection->transaction(function () use ($activity, $crmActivityService, $activityRepository) {
Log::info('[MatchActivityCrmData] Starting CRM data matching', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'set_configuration' => $this->fromConfiguration?->getId(),
'old_state' => [
'lead_id' => $activity->getLead()?->getId(),
'contact_id' => $activity->getContact()?->getId(),
'account_id' => $activity->getAccount()?->getId(),
'opportunity_id' => $activity->getOpportunity()?->getId(),
'stage_id' => $activity->getStage()?->getId(),
],
]);
$this->resetCrmMappings($activity, $activityRepository);
$this->switchCrmConfigurationIfNeeded($activity);
$activity->refresh();
$crmActivityService->updateCrmData(
activity: $activity,
remoteSearch: $this->remoteSearch,
);
$hasMatch = $activity->getLead() !== null
|| $activity->getContact() !== null
|| $activity->getAccount() !== null
|| $activity->getOpportunity() !== null;
if ($hasMatch) {
Log::info('[MatchActivityCrmData] Successfully matched CRM data', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'lead_id' => $activity->getLead()?->getId(),
'contact_id' => $activity->getContact()?->getId(),
'account_id' => $activity->getAccount()?->getId(),
'opportunity_id' => $activity->getOpportunity()?->getId(),
'stage_id' => $activity->getStage()?->getId(),
]);
} else {
Log::info('[MatchActivityCrmData] No CRM match found', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
]);
}
});
} catch (Throwable $e) {
if (! $e instanceof RateLimitException) {
Log::error('[MatchActivityCrmData] Failed to match CRM data', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'exception' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
]);
}
throw $e;
}
}
public function failed(Throwable $exception): void
{
Log::error('[MatchActivityCrmData] Job permanently failed after all retries', [
'activity' => $this->activityId,
'remote_search' => $this->remoteSearch,
'from_configuration' => $this->fromConfiguration?->getId(),
'exception' => $exception->getMessage(),
'attempts' => $this->attempts(),
]);
}
private function resetCrmMappings(
Activity $activity,
ActivityRepository $activityRepository
): void {
$activity->update([
'lead_id' => null,
'contact_id' => null,
'account_id' => null,
'opportunity_id' => null,
'stage_id' => null,
]);
$participantsOldState = $activityRepository->getActivityParticipants($activity)
->map(function ($participant) {
return [
'id' => $participant->id,
'user_id' => $participant->user_id,
'contact_id' => $participant->contact_id,
'lead_id' => $participant->lead_id,
];
});
if ($participantsOldState->isNotEmpty()) {
Log::info('[MatchActivityCrmData] Participants old state', [
'activity' => $this->activityId,
'participants' => $participantsOldState->toArray(),
]);
}
$activity->participants()->update([
'user_id' => null,
'contact_id' => null,
'lead_id' => null,
]);
}
private function switchCrmConfigurationIfNeeded(Activity $activity): void
{
if ($this->fromConfiguration === null) {
return;
}
if ($activity->getCrm()?->getId() === $this->fromConfiguration->getId()) {
return;
}
Log::info('[MatchActivityCrmData] Switching CRM configuration', [
'activity' => $this->activityId,
'old_configuration' => $activity->getCrm()?->getId(),
'new_configuration' => $this->fromConfiguration->getId(),
]);
$activity->update([
'crm_configuration_id' => $this->fromConfiguration->getId(),
'crm_provider_id' => null,
]);
}
}
Review rate limit handli…, Editor Group 2
remote
app (Git) - JY-20725-handle-HS-search-rate-limit*+, Checkout Branch/Tag...
JY-20725-handle-HS-search-rate-limit*+
app (Git) - Publish Branch
Errors: 6, Warnings: 9, Infos: 2
6
9
2
Notifications
key, PHP extension: Premium features not active.
Sign In
Sign In
Info: You have Docker installed on your system. Do you want to install the recommended extensions from Microsoft for it?
Clear
Review rate limit handling for HubSpot job queue
Session history
New session
Message actions
RateLimitException.php#9-9
RateLimitException.php#9-9
Reveiw the diff. Mostly
@app/Jobs/Crm/MatchActivityCrmData.php
,
@app/Exceptions/RateLimitException.php
,
@app/Jobs/Middleware/HandleHubspotRateLimit.php
,
@app/Services/Crm/Hubspot/Client.php
and
@app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php
. The issue is I am trying to make sure that instant spike of MatchActivityCrmData jobs willl handle 429 exceptions from hubspot. Revewi ti carefully and try to see potential issues and bottlenecks. Also RateLimitException was changerd from LogicException to RuntimeException. Is it ok. This exception is used by other paerts of code. Will ti break anything?
Thought for 5s
Thought for 5s
I'll review the implementation carefully. Let me first check how
RateLimitException
is used elsewhere and look at the test files and
PaginationState
.
Bash
Find all usages of RateLimitException outside the changed files
IN
grep -rn "RateLimitException" /Users/lukas/jiminny/app/app --include="*.php" | grep -v "HandleHubspotRateLimit\|MatchActivityCrmData\|Client.php\|RateLimitException.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:13:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
/Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php:17:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php:68: RateLimitException |
/Users/lukas/jiminny/app/app/Component/TranscriptionSummary/Jobs/SummarizeTranscriptionJob.php:15:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/TranscriptionSummary/Jobs/SummarizeTranscriptionJob.php:58: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
/Users/lukas/jiminny/app/app/Component/AiActivityType/Jobs/GenerateAiActivityTypeJob.php:19:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/AiActivityType/Jobs/GenerateAiActivityTypeJob.php:76: RateLimitException |
/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/HubspotClientInterface.php:8:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/HubspotClientInterface.php:50: * @throws RateLimitException When rate limit is hit
/Users/lukas/jiminny/app/app/Services/Crm/Hubspot/Pagination/HubspotPaginationService.php:195: // RateLimitException and other exceptions are re-thrown as-is
Read
PaginationState.php
PaginationState.php
Read
HandleHubspotRateLimitTest.php
HandleHubspotRateLimitTest.php
Bash
Check how RateLimitException is used in GenerateActionItemsJob
IN
grep -rn "RateLimitException\|LogicException\|RuntimeException" /Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php | head -20
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:13:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php:51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
Bash
Find all catch blocks or instanceof checks for RateLimitException
IN
grep -rn "catch.*RateLimitException\|instanceof RateLimitException" /Users/lukas/jiminny/app/app --include="*.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Jobs/Middleware/HandleHubspotRateLimit.php:11: * Job middleware that catches RateLimitException from HubSpot API calls
/Users/lukas/jiminny/app/app/Jobs/Middleware/HandleHubspotRateLimit.php:24: } catch (RateLimitException $e) {
/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:149: if (! $e instanceof RateLimitException) {
Bash
Find all test references to RateLimitException
IN
grep -rn "RateLimitException" /Users/lukas/jiminny/app/tests --include="*.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:8:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:13:#[CoversClass(RateLimitException::class)]
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:14:class RateLimitExceptionTest extends TestCase
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:18: $exception = new RateLimitException();
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:28: $exception = new RateLimitException('Hubspot rate limit', 30, $previous);
/Users/lukas/jiminny/app/tests/Unit/Exceptions/RateLimitExceptionTest.php:52: $exception = new RateLimitException('test', $input);
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:10:use Jiminny\Exceptions\RateLimitException;
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:49: public function testPropagatesNonRateLimitExceptions(): void
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:103: throw new RateLimitException('rate limited', $retryAfter);
/Users/lukas/jiminny/app/tests/Unit/Jobs/Middleware/HandleHubspotRateLimitTest.php:150: throw new RateLimitException('rate limited', 1);
Bash
Check retry/failure handling in GenerateActionItemsJob
IN
grep -n "RateLimitException\|retryUntil\|backoff\|maxExceptions\|maxTries\|release\|failed" /Users/lukas/jiminny/app/app/Component/ActionItems/Jobs/GenerateActionItemsJob.php | head -30
Copy code to clipboard
OUT
13:use Jiminny\Exceptions\RateLimitException;
51: GuzzleException|HttpBadRequestException|JsonException|RateLimitException|UnexpectedValueException $exception
56: $this->release(30);
Bash
Check retry/failure handling in GenerateAiCallScoringJob
IN
grep -n "RateLimitException\|retryUntil\|backoff\|maxExceptions\|maxTries\|release\|failed" /Users/lukas/jiminny/app/app/Component/AiCallScoring/Jobs/GenerateAiCallScoringJob.php | head -30
Copy code to clipboard
OUT
17:use Jiminny\Exceptions\RateLimitException;
68: RateLimitException |
75: $this->release(30);
Bash
Check retry config in MatchActivityCrmData
IN
grep -n "retryAfter\|RETRY_WINDOW\|retryUntil\|maxTries" /Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php
Copy code to clipboard
OUT
34: private const int RETRY_WINDOW_MINUTES = 30;
45: public function retryUntil(): \DateTimeInterface
47: return now()->addMinutes(self::RETRY_WINDOW_MINUTES);
77: return self::RETRY_WINDOW_MINUTES * 60 + 60;
Bash
Check the cache key format
IN
grep -n "getRateLimitCacheKey\|hubspot:ratelimit" /Users/lukas/jiminny/app/app/Services/Crm/Hubspot/Client.php
Copy code to clipboard
OUT
78: $cacheKey = $this->getRateLimitCacheKey();
110: private function getRateLimitCacheKey(): string
112: return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
Bash
Find other jobs that might use the rate limit middleware
IN
grep -rn "class.*Middleware\|HandleHubspotRateLimit" /Users/lukas/jiminny/app/app/Jobs --include="*.php" | grep -v "HandleHubspotRateLimit.php"
Copy code to clipboard
OUT
/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:18:use Jiminny\Jobs\Middleware\HandleHubspotRateLimit;
/Users/lukas/jiminny/app/app/Jobs/Crm/MatchActivityCrmData.php:42: return [new HandleHubspotRateLimit()];
Read
HubspotClientInterface.php
HubspotClientInterface.php
Thought for 73s
Thought for 73s
Now I have a complete picture. Here's my full analysis:
Review Summary
Review Summary
RuntimeException vs LogicException — Safe ✓
RuntimeException
vs
LogicException
— Safe ✓
The change is semantically correct and won't break anything.
LogicException
is for programmer errors (invalid arguments, contract violations). A rate limit from an external API is a runtime condition —
RuntimeException
is the right parent. All callers catch
RateLimitException
by name explicitly (union catches in
GenerateActionItemsJob
,
GenerateAiCallScoringJob
,
SummarizeTranscriptionJob
,
GenerateAiActivityTypeJob
) or check
instanceof RateLimitException
— none relies on the parent class type, so nothing breaks.
Issue 1 — Circuit breaker stores stale delay (most important bug)
Issue 1 — Circuit breaker stores stale delay (most important bug)
Client.php:94
Client.php:94
Copy code to clipboard
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
The TTL is
$retryAfter
seconds, but the
stored value
is also the original
$retryAfter
. If a second job reads this cache 20 seconds later, it throws
RateLimitException(retryAfter=30)
and gets delayed 30 more seconds — even though only 10 remain. In a spike of 100 jobs, each subsequent job inflates its wait.
Fix:
store the absolute expiry timestamp, reconstruct the remaining delay when reading:
Copy code to clipboard
// on 429:
Redis::setex($cacheKey, $retryAfter, (string) (time() + $retryAfter));
// in the cached-read branch:
$remaining = max(1, (int) $cachedRetryAfter - time());
throw new RateLimitException('Hubspot rate limit (cached circuit-breaker)', $remaining);
Issue 2 — retryUntil() window may expire under sustained rate limiting
Issue 2 —
retryUntil()
window may expire under sustained rate limiting
MatchActivityCrmData.php:45-47
MatchActivityCrmData.php:45-47
retryUntil()
is calculated as
now() + 30 min
at
dispatch time
and stored in the job payload. With
MAX_RETRY_DELAY = 600s
, you only get ~3 rate-limit-triggered releases before the 30-minute window closes and the job is permanently failed. For a heavy 429 spike (daily limit, parsed as 600s), this can easily happen.
Consider increasing
RETRY_WINDOW_MINUTES
to 60 or more, or making it configurable. The
uniqueFor()
value should be updated to match.
Issue 3 — Only search() uses the circuit breaker, but other methods can still hit 429
Issue 3 — Only
search()
uses the circuit breaker, but other methods can still hit 429
Client.php:76-108
Client.php:76-108
executeRequest()
is only called from
search()
. Methods like
getOpportunityById()
,
batchReadObjects()
,
getContactByEmail()
bypass it entirely. If HubSpot's 429 is account-wide (not search-endpoint-specific), those methods will keep firing even while the circuit breaker is supposedly open. This is likely fine because the search endpoint has its own tighter quota (5 RPS), but it's worth being explicit in a comment.
Issue 4 — object $job type in middleware has no compile-time safety
Issue 4 —
object $job
type in middleware has no compile-time safety
HandleHubspotRateLimit.php:20
HandleHubspotRateLimit.php:20
Copy code to clipboard
public function handle(object $job, callable $next): void
Calling
$job->attempts()
and
$job->release()
on
object
will work at runtime since Laravel always passes jobs that use
InteractsWithQueue
, but PHPStan/psalm won't verify this and it could silently break in tests with bare mocks (as your test does use a
Job
mock that has
attempts()
— so the test is fine, but the real type contract is invisible). Minor, but worth tightening to
\Illuminate\Contracts\Queue\Job
.
What works well ✓
What works well ✓
RateLimitException
is caught by the middleware
before
it increments
maxExceptions
, so rate-limit releases don't consume the 3-exception budget for real failures.
The middleware's jitter (
random_int(0, 5)
) prevents thundering herd on release.
The log-sampling logic (
attempts <= 3 || attempts % 10 === 0
) keeps logs useful without flooding.
ShouldBeUnique
+
uniqueFor()
correctly prevents duplicate jobs queuing up during the rate-limit wait window.
RateLimitException
propagates cleanly through the DB transaction (rolled back), then through the job catch block (logged conditionally), then to the middleware which handles it.
The pagination service re-throws
RateLimitException
as-is and resets pagination state on the next job attempt — safe because offset restarts from 0.
Message actions
Expand on 1 and 2. Let's consider there are several jobs running from ten workers. They are out fired instantly, and therefore there is no cache when they look for cache, but once they receive 429, they store cache. Can there be some potential issues with that flow?
Thought for 91s
Thought for 91s...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
2770
|
113
|
1
|
2026-05-07T11:39:37.580111+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778153977580_m1.jpg...
|
PhpStorm
|
faVsco.js – WebhookSyncBatchProcessor.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
Editor for custom.log
Sync Changes
Hide This Notification
Code changed:
Hide
8
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use Illuminate\Support\Facades\Log;
use Jiminny\Jobs\Crm\Hubspot\ImportAccountBatch;
use Jiminny\Jobs\Crm\Hubspot\ImportContactBatch;
use Jiminny\Jobs\Crm\Hubspot\ImportOpportunityBatch;
/**
* Processes batches of HubSpot objects collected from webhook events.
*
* This service drains Redis sets containing CRM IDs that were collected from webhook
* property change and association change events. It dispatches Import*Batch jobs to
* process the objects in batches of 100.
*
* Design Decisions:
*
* 1. Redis Service Injection:
* BatchSyncRedisService is injected via constructor for testability and to avoid
* tight coupling to Redis facade. This allows easy mocking in tests.
*
* 2. Multi-Object Type Support:
* processBatchesForObjectType() directly with their specific object type.
*
* 3. Batch Size and Limits:
* - BATCH_SIZE = 100: HubSpot batch API limit
* - MAX_BATCHES = 1000: Safety limit to prevent infinite loops (100K objects max per run)
*
* 4. Failure Handling:
* If job dispatch fails, IDs are requeued to Redis for the next processing cycle.
* Individual job failures are handled by the Import*Batch jobs themselves.
*/
class WebhookSyncBatchProcessor
{
public const string OBJECT_TYPE_DEAL = 'deal';
public const string OBJECT_TYPE_CONTACT = 'contact';
public const string OBJECT_TYPE_COMPANY = 'company';
private const int BATCH_SIZE = 100;
private const int MAX_BATCHES = 1000;
private const array SUPPORTED_OBJECT_TYPES = [
self::OBJECT_TYPE_DEAL,
self::OBJECT_TYPE_CONTACT,
self::OBJECT_TYPE_COMPANY,
];
public function __construct(
private BatchSyncRedisService $redisService
) {
}
/**
* Process batches for a specific object type.
*
* Drains the Redis set for the given object type and config, dispatching Import*Batch
* jobs in batches of 100 until the set is empty or MAX_BATCHES is reached.
*
* @param string $objectType One of: 'deal', 'contact', 'company'
* @param int $configId CRM configuration ID
*
* @return int Total number of IDs dispatched to jobs
*/
public function processBatchesForObjectType(string $objectType, int $configId): int
{
if (! in_array($objectType, self::SUPPORTED_OBJECT_TYPES, true)) {
Log::warning('[WebhookSyncBatchProcessor] Unsupported object type', [
'object_type' => $objectType,
'config_id' => $configId,
]);
return 0;
}
$processedCount = 0;
$batchNumber = 0;
while ($batchNumber < self::MAX_BATCHES) {
try {
$crmProviderIds = $this->redisService->getCollectedObjects(
$objectType,
$configId,
'all',
self::BATCH_SIZE
);
} catch (\Throwable $e) {
Log::error('[WebhookSyncBatchProcessor] Failed to fetch IDs from Redis', [
'object_type' => $objectType,
'config_id' => $configId,
'batch_number' => $batchNumber,
'error' => $e->getMessage(),
]);
break;
}
if (empty($crmProviderIds)) {
break;
}
try {
$this->dispatchBatchJob($objectType, $configId, $crmProviderIds);
$processedCount += \count($crmProviderIds);
$batchNumber++;
} catch (\Throwable $e) {
Log::error('[WebhookSyncBatchProcessor] Batch dispatch failed, stopping', [
'object_type' => $objectType,
'config_id' => $configId,
'batch_number' => $batchNumber,
'batch_size' => \count($crmProviderIds),
'error' => $e->getMessage(),
]);
$this->requeueFailedIds($objectType, $configId, $crmProviderIds);
break;
}
}
if ($batchNumber >= self::MAX_BATCHES) {
Log::warning('[WebhookSyncBatchProcessor] Maximum batch limit reached', [
'object_type' => $objectType,
'config_id' => $configId,
'max_batches' => self::MAX_BATCHES,
'total_dispatched' => $processedCount,
]);
}
if ($processedCount > 0) {
Log::info('[WebhookSyncBatchProcessor] Batch processing completed', [
'object_type' => $objectType,
'config_id' => $configId,
'total_dispatched' => $processedCount,
'batches_dispatched' => $batchNumber,
]);
}
return $processedCount;
}
private function dispatchBatchJob(string $objectType, int $configId, array $crmProviderIds): void
{
match ($objectType) {
self::OBJECT_TYPE_DEAL => ImportOpportunityBatch::dispatch($configId, $crmProviderIds),
self::OBJECT_TYPE_CONTACT => ImportContactBatch::dispatch($configId, $crmProviderIds),
self::OBJECT_TYPE_COMPANY => ImportAccountBatch::dispatch($configId, $crmProviderIds),
};
}
private function requeueFailedIds(string $objectType, int $configId, array $crmProviderIds): void
{
$succeeded = 0;
$permanentlyFailed = [];
foreach ($crmProviderIds as $crmProviderId) {
try {
$this->redisService->collectObjectIdToBatch(
$objectType,
$crmProviderId,
$configId,
'all'
);
$succeeded++;
} catch (\Throwable $idError) {
$permanentlyFailed[] = $crmProviderId;
Log::warning('[WebhookSyncBatchProcessor] Failed to requeue ID', [
'object_type' => $objectType,
'config_id' => $configId,
'crm_provider_id' => $crmProviderId,
'error' => $idError->getMessage(),
]);
}
}
Log::info('[WebhookSyncBatchProcessor] Requeue completed', [
'object_type' => $objectType,
'config_id' => $configId,
'succeeded' => $succeeded,
'failed' => \count($permanentlyFailed),
'total' => \count($crmProviderIds),
]);
if (! empty($permanentlyFailed)) {
Log::error('[WebhookSyncBatchProcessor] Permanently failed to requeue IDs', [
'object_type' => $objectType,
'config_id' => $configId,
'failed_ids' => $permanentlyFailed,
]);
}
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"master, menu","depth":5,"on_screen":true,"help_text":"Git Branch: master","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Editor for custom.log","depth":4,"on_screen":true,"role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Jobs\\Crm\\Hubspot\\ImportAccountBatch;\nuse Jiminny\\Jobs\\Crm\\Hubspot\\ImportContactBatch;\nuse Jiminny\\Jobs\\Crm\\Hubspot\\ImportOpportunityBatch;\n\n/**\n * Processes batches of HubSpot objects collected from webhook events.\n *\n * This service drains Redis sets containing CRM IDs that were collected from webhook\n * property change and association change events. It dispatches Import*Batch jobs to\n * process the objects in batches of 100.\n *\n * Design Decisions:\n *\n * 1. Redis Service Injection:\n * BatchSyncRedisService is injected via constructor for testability and to avoid\n * tight coupling to Redis facade. This allows easy mocking in tests.\n *\n * 2. Multi-Object Type Support:\n * processBatchesForObjectType() directly with their specific object type.\n *\n * 3. Batch Size and Limits:\n * - BATCH_SIZE = 100: HubSpot batch API limit\n * - MAX_BATCHES = 1000: Safety limit to prevent infinite loops (100K objects max per run)\n *\n * 4. Failure Handling:\n * If job dispatch fails, IDs are requeued to Redis for the next processing cycle.\n * Individual job failures are handled by the Import*Batch jobs themselves.\n */\nclass WebhookSyncBatchProcessor\n{\n public const string OBJECT_TYPE_DEAL = 'deal';\n public const string OBJECT_TYPE_CONTACT = 'contact';\n public const string OBJECT_TYPE_COMPANY = 'company';\n private const int BATCH_SIZE = 100;\n private const int MAX_BATCHES = 1000;\n\n private const array SUPPORTED_OBJECT_TYPES = [\n self::OBJECT_TYPE_DEAL,\n self::OBJECT_TYPE_CONTACT,\n self::OBJECT_TYPE_COMPANY,\n ];\n\n public function __construct(\n private BatchSyncRedisService $redisService\n ) {\n }\n\n /**\n * Process batches for a specific object type.\n *\n * Drains the Redis set for the given object type and config, dispatching Import*Batch\n * jobs in batches of 100 until the set is empty or MAX_BATCHES is reached.\n *\n * @param string $objectType One of: 'deal', 'contact', 'company'\n * @param int $configId CRM configuration ID\n *\n * @return int Total number of IDs dispatched to jobs\n */\n public function processBatchesForObjectType(string $objectType, int $configId): int\n {\n if (! in_array($objectType, self::SUPPORTED_OBJECT_TYPES, true)) {\n Log::warning('[WebhookSyncBatchProcessor] Unsupported object type', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n ]);\n\n return 0;\n }\n\n $processedCount = 0;\n $batchNumber = 0;\n\n while ($batchNumber < self::MAX_BATCHES) {\n try {\n $crmProviderIds = $this->redisService->getCollectedObjects(\n $objectType,\n $configId,\n 'all',\n self::BATCH_SIZE\n );\n } catch (\\Throwable $e) {\n Log::error('[WebhookSyncBatchProcessor] Failed to fetch IDs from Redis', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'batch_number' => $batchNumber,\n 'error' => $e->getMessage(),\n ]);\n\n break;\n }\n\n if (empty($crmProviderIds)) {\n break;\n }\n\n try {\n $this->dispatchBatchJob($objectType, $configId, $crmProviderIds);\n\n $processedCount += \\count($crmProviderIds);\n $batchNumber++;\n } catch (\\Throwable $e) {\n Log::error('[WebhookSyncBatchProcessor] Batch dispatch failed, stopping', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'batch_number' => $batchNumber,\n 'batch_size' => \\count($crmProviderIds),\n 'error' => $e->getMessage(),\n ]);\n\n $this->requeueFailedIds($objectType, $configId, $crmProviderIds);\n\n break;\n }\n }\n\n if ($batchNumber >= self::MAX_BATCHES) {\n Log::warning('[WebhookSyncBatchProcessor] Maximum batch limit reached', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'max_batches' => self::MAX_BATCHES,\n 'total_dispatched' => $processedCount,\n ]);\n }\n\n if ($processedCount > 0) {\n Log::info('[WebhookSyncBatchProcessor] Batch processing completed', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'total_dispatched' => $processedCount,\n 'batches_dispatched' => $batchNumber,\n ]);\n }\n\n return $processedCount;\n }\n\n private function dispatchBatchJob(string $objectType, int $configId, array $crmProviderIds): void\n {\n match ($objectType) {\n self::OBJECT_TYPE_DEAL => ImportOpportunityBatch::dispatch($configId, $crmProviderIds),\n self::OBJECT_TYPE_CONTACT => ImportContactBatch::dispatch($configId, $crmProviderIds),\n self::OBJECT_TYPE_COMPANY => ImportAccountBatch::dispatch($configId, $crmProviderIds),\n };\n }\n\n private function requeueFailedIds(string $objectType, int $configId, array $crmProviderIds): void\n {\n $succeeded = 0;\n $permanentlyFailed = [];\n\n foreach ($crmProviderIds as $crmProviderId) {\n try {\n $this->redisService->collectObjectIdToBatch(\n $objectType,\n $crmProviderId,\n $configId,\n 'all'\n );\n $succeeded++;\n } catch (\\Throwable $idError) {\n $permanentlyFailed[] = $crmProviderId;\n Log::warning('[WebhookSyncBatchProcessor] Failed to requeue ID', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'crm_provider_id' => $crmProviderId,\n 'error' => $idError->getMessage(),\n ]);\n }\n }\n\n Log::info('[WebhookSyncBatchProcessor] Requeue completed', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'succeeded' => $succeeded,\n 'failed' => \\count($permanentlyFailed),\n 'total' => \\count($crmProviderIds),\n ]);\n\n if (! empty($permanentlyFailed)) {\n Log::error('[WebhookSyncBatchProcessor] Permanently failed to requeue IDs', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'failed_ids' => $permanentlyFailed,\n ]);\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Jobs\\Crm\\Hubspot\\ImportAccountBatch;\nuse Jiminny\\Jobs\\Crm\\Hubspot\\ImportContactBatch;\nuse Jiminny\\Jobs\\Crm\\Hubspot\\ImportOpportunityBatch;\n\n/**\n * Processes batches of HubSpot objects collected from webhook events.\n *\n * This service drains Redis sets containing CRM IDs that were collected from webhook\n * property change and association change events. It dispatches Import*Batch jobs to\n * process the objects in batches of 100.\n *\n * Design Decisions:\n *\n * 1. Redis Service Injection:\n * BatchSyncRedisService is injected via constructor for testability and to avoid\n * tight coupling to Redis facade. This allows easy mocking in tests.\n *\n * 2. Multi-Object Type Support:\n * processBatchesForObjectType() directly with their specific object type.\n *\n * 3. Batch Size and Limits:\n * - BATCH_SIZE = 100: HubSpot batch API limit\n * - MAX_BATCHES = 1000: Safety limit to prevent infinite loops (100K objects max per run)\n *\n * 4. Failure Handling:\n * If job dispatch fails, IDs are requeued to Redis for the next processing cycle.\n * Individual job failures are handled by the Import*Batch jobs themselves.\n */\nclass WebhookSyncBatchProcessor\n{\n public const string OBJECT_TYPE_DEAL = 'deal';\n public const string OBJECT_TYPE_CONTACT = 'contact';\n public const string OBJECT_TYPE_COMPANY = 'company';\n private const int BATCH_SIZE = 100;\n private const int MAX_BATCHES = 1000;\n\n private const array SUPPORTED_OBJECT_TYPES = [\n self::OBJECT_TYPE_DEAL,\n self::OBJECT_TYPE_CONTACT,\n self::OBJECT_TYPE_COMPANY,\n ];\n\n public function __construct(\n private BatchSyncRedisService $redisService\n ) {\n }\n\n /**\n * Process batches for a specific object type.\n *\n * Drains the Redis set for the given object type and config, dispatching Import*Batch\n * jobs in batches of 100 until the set is empty or MAX_BATCHES is reached.\n *\n * @param string $objectType One of: 'deal', 'contact', 'company'\n * @param int $configId CRM configuration ID\n *\n * @return int Total number of IDs dispatched to jobs\n */\n public function processBatchesForObjectType(string $objectType, int $configId): int\n {\n if (! in_array($objectType, self::SUPPORTED_OBJECT_TYPES, true)) {\n Log::warning('[WebhookSyncBatchProcessor] Unsupported object type', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n ]);\n\n return 0;\n }\n\n $processedCount = 0;\n $batchNumber = 0;\n\n while ($batchNumber < self::MAX_BATCHES) {\n try {\n $crmProviderIds = $this->redisService->getCollectedObjects(\n $objectType,\n $configId,\n 'all',\n self::BATCH_SIZE\n );\n } catch (\\Throwable $e) {\n Log::error('[WebhookSyncBatchProcessor] Failed to fetch IDs from Redis', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'batch_number' => $batchNumber,\n 'error' => $e->getMessage(),\n ]);\n\n break;\n }\n\n if (empty($crmProviderIds)) {\n break;\n }\n\n try {\n $this->dispatchBatchJob($objectType, $configId, $crmProviderIds);\n\n $processedCount += \\count($crmProviderIds);\n $batchNumber++;\n } catch (\\Throwable $e) {\n Log::error('[WebhookSyncBatchProcessor] Batch dispatch failed, stopping', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'batch_number' => $batchNumber,\n 'batch_size' => \\count($crmProviderIds),\n 'error' => $e->getMessage(),\n ]);\n\n $this->requeueFailedIds($objectType, $configId, $crmProviderIds);\n\n break;\n }\n }\n\n if ($batchNumber >= self::MAX_BATCHES) {\n Log::warning('[WebhookSyncBatchProcessor] Maximum batch limit reached', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'max_batches' => self::MAX_BATCHES,\n 'total_dispatched' => $processedCount,\n ]);\n }\n\n if ($processedCount > 0) {\n Log::info('[WebhookSyncBatchProcessor] Batch processing completed', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'total_dispatched' => $processedCount,\n 'batches_dispatched' => $batchNumber,\n ]);\n }\n\n return $processedCount;\n }\n\n private function dispatchBatchJob(string $objectType, int $configId, array $crmProviderIds): void\n {\n match ($objectType) {\n self::OBJECT_TYPE_DEAL => ImportOpportunityBatch::dispatch($configId, $crmProviderIds),\n self::OBJECT_TYPE_CONTACT => ImportContactBatch::dispatch($configId, $crmProviderIds),\n self::OBJECT_TYPE_COMPANY => ImportAccountBatch::dispatch($configId, $crmProviderIds),\n };\n }\n\n private function requeueFailedIds(string $objectType, int $configId, array $crmProviderIds): void\n {\n $succeeded = 0;\n $permanentlyFailed = [];\n\n foreach ($crmProviderIds as $crmProviderId) {\n try {\n $this->redisService->collectObjectIdToBatch(\n $objectType,\n $crmProviderId,\n $configId,\n 'all'\n );\n $succeeded++;\n } catch (\\Throwable $idError) {\n $permanentlyFailed[] = $crmProviderId;\n Log::warning('[WebhookSyncBatchProcessor] Failed to requeue ID', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'crm_provider_id' => $crmProviderId,\n 'error' => $idError->getMessage(),\n ]);\n }\n }\n\n Log::info('[WebhookSyncBatchProcessor] Requeue completed', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'succeeded' => $succeeded,\n 'failed' => \\count($permanentlyFailed),\n 'total' => \\count($crmProviderIds),\n ]);\n\n if (! empty($permanentlyFailed)) {\n Log::error('[WebhookSyncBatchProcessor] Permanently failed to requeue IDs', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'failed_ids' => $permanentlyFailed,\n ]);\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8010415956189026930
|
-8883631698440123185
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
Editor for custom.log
Sync Changes
Hide This Notification
Code changed:
Hide
8
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use Illuminate\Support\Facades\Log;
use Jiminny\Jobs\Crm\Hubspot\ImportAccountBatch;
use Jiminny\Jobs\Crm\Hubspot\ImportContactBatch;
use Jiminny\Jobs\Crm\Hubspot\ImportOpportunityBatch;
/**
* Processes batches of HubSpot objects collected from webhook events.
*
* This service drains Redis sets containing CRM IDs that were collected from webhook
* property change and association change events. It dispatches Import*Batch jobs to
* process the objects in batches of 100.
*
* Design Decisions:
*
* 1. Redis Service Injection:
* BatchSyncRedisService is injected via constructor for testability and to avoid
* tight coupling to Redis facade. This allows easy mocking in tests.
*
* 2. Multi-Object Type Support:
* processBatchesForObjectType() directly with their specific object type.
*
* 3. Batch Size and Limits:
* - BATCH_SIZE = 100: HubSpot batch API limit
* - MAX_BATCHES = 1000: Safety limit to prevent infinite loops (100K objects max per run)
*
* 4. Failure Handling:
* If job dispatch fails, IDs are requeued to Redis for the next processing cycle.
* Individual job failures are handled by the Import*Batch jobs themselves.
*/
class WebhookSyncBatchProcessor
{
public const string OBJECT_TYPE_DEAL = 'deal';
public const string OBJECT_TYPE_CONTACT = 'contact';
public const string OBJECT_TYPE_COMPANY = 'company';
private const int BATCH_SIZE = 100;
private const int MAX_BATCHES = 1000;
private const array SUPPORTED_OBJECT_TYPES = [
self::OBJECT_TYPE_DEAL,
self::OBJECT_TYPE_CONTACT,
self::OBJECT_TYPE_COMPANY,
];
public function __construct(
private BatchSyncRedisService $redisService
) {
}
/**
* Process batches for a specific object type.
*
* Drains the Redis set for the given object type and config, dispatching Import*Batch
* jobs in batches of 100 until the set is empty or MAX_BATCHES is reached.
*
* @param string $objectType One of: 'deal', 'contact', 'company'
* @param int $configId CRM configuration ID
*
* @return int Total number of IDs dispatched to jobs
*/
public function processBatchesForObjectType(string $objectType, int $configId): int
{
if (! in_array($objectType, self::SUPPORTED_OBJECT_TYPES, true)) {
Log::warning('[WebhookSyncBatchProcessor] Unsupported object type', [
'object_type' => $objectType,
'config_id' => $configId,
]);
return 0;
}
$processedCount = 0;
$batchNumber = 0;
while ($batchNumber < self::MAX_BATCHES) {
try {
$crmProviderIds = $this->redisService->getCollectedObjects(
$objectType,
$configId,
'all',
self::BATCH_SIZE
);
} catch (\Throwable $e) {
Log::error('[WebhookSyncBatchProcessor] Failed to fetch IDs from Redis', [
'object_type' => $objectType,
'config_id' => $configId,
'batch_number' => $batchNumber,
'error' => $e->getMessage(),
]);
break;
}
if (empty($crmProviderIds)) {
break;
}
try {
$this->dispatchBatchJob($objectType, $configId, $crmProviderIds);
$processedCount += \count($crmProviderIds);
$batchNumber++;
} catch (\Throwable $e) {
Log::error('[WebhookSyncBatchProcessor] Batch dispatch failed, stopping', [
'object_type' => $objectType,
'config_id' => $configId,
'batch_number' => $batchNumber,
'batch_size' => \count($crmProviderIds),
'error' => $e->getMessage(),
]);
$this->requeueFailedIds($objectType, $configId, $crmProviderIds);
break;
}
}
if ($batchNumber >= self::MAX_BATCHES) {
Log::warning('[WebhookSyncBatchProcessor] Maximum batch limit reached', [
'object_type' => $objectType,
'config_id' => $configId,
'max_batches' => self::MAX_BATCHES,
'total_dispatched' => $processedCount,
]);
}
if ($processedCount > 0) {
Log::info('[WebhookSyncBatchProcessor] Batch processing completed', [
'object_type' => $objectType,
'config_id' => $configId,
'total_dispatched' => $processedCount,
'batches_dispatched' => $batchNumber,
]);
}
return $processedCount;
}
private function dispatchBatchJob(string $objectType, int $configId, array $crmProviderIds): void
{
match ($objectType) {
self::OBJECT_TYPE_DEAL => ImportOpportunityBatch::dispatch($configId, $crmProviderIds),
self::OBJECT_TYPE_CONTACT => ImportContactBatch::dispatch($configId, $crmProviderIds),
self::OBJECT_TYPE_COMPANY => ImportAccountBatch::dispatch($configId, $crmProviderIds),
};
}
private function requeueFailedIds(string $objectType, int $configId, array $crmProviderIds): void
{
$succeeded = 0;
$permanentlyFailed = [];
foreach ($crmProviderIds as $crmProviderId) {
try {
$this->redisService->collectObjectIdToBatch(
$objectType,
$crmProviderId,
$configId,
'all'
);
$succeeded++;
} catch (\Throwable $idError) {
$permanentlyFailed[] = $crmProviderId;
Log::warning('[WebhookSyncBatchProcessor] Failed to requeue ID', [
'object_type' => $objectType,
'config_id' => $configId,
'crm_provider_id' => $crmProviderId,
'error' => $idError->getMessage(),
]);
}
}
Log::info('[WebhookSyncBatchProcessor] Requeue completed', [
'object_type' => $objectType,
'config_id' => $configId,
'succeeded' => $succeeded,
'failed' => \count($permanentlyFailed),
'total' => \count($crmProviderIds),
]);
if (! empty($permanentlyFailed)) {
Log::error('[WebhookSyncBatchProcessor] Permanently failed to requeue IDs', [
'object_type' => $objectType,
'config_id' => $configId,
'failed_ids' => $permanentlyFailed,
]);
}
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
2768
|
NULL
|
NULL
|
NULL
|
|
2771
|
114
|
1
|
2026-05-07T11:39:37.580002+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778153977580_m2.jpg...
|
PhpStorm
|
faVsco.js – WebhookSyncBatchProcessor.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
Editor for custom.log
Sync Changes
Hide This Notification
Code changed:
Hide
8
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use Illuminate\Support\Facades\Log;
use Jiminny\Jobs\Crm\Hubspot\ImportAccountBatch;
use Jiminny\Jobs\Crm\Hubspot\ImportContactBatch;
use Jiminny\Jobs\Crm\Hubspot\ImportOpportunityBatch;
/**
* Processes batches of HubSpot objects collected from webhook events.
*
* This service drains Redis sets containing CRM IDs that were collected from webhook
* property change and association change events. It dispatches Import*Batch jobs to
* process the objects in batches of 100.
*
* Design Decisions:
*
* 1. Redis Service Injection:
* BatchSyncRedisService is injected via constructor for testability and to avoid
* tight coupling to Redis facade. This allows easy mocking in tests.
*
* 2. Multi-Object Type Support:
* processBatchesForObjectType() directly with their specific object type.
*
* 3. Batch Size and Limits:
* - BATCH_SIZE = 100: HubSpot batch API limit
* - MAX_BATCHES = 1000: Safety limit to prevent infinite loops (100K objects max per run)
*
* 4. Failure Handling:
* If job dispatch fails, IDs are requeued to Redis for the next processing cycle.
* Individual job failures are handled by the Import*Batch jobs themselves.
*/
class WebhookSyncBatchProcessor
{
public const string OBJECT_TYPE_DEAL = 'deal';
public const string OBJECT_TYPE_CONTACT = 'contact';
public const string OBJECT_TYPE_COMPANY = 'company';
private const int BATCH_SIZE = 100;
private const int MAX_BATCHES = 1000;
private const array SUPPORTED_OBJECT_TYPES = [
self::OBJECT_TYPE_DEAL,
self::OBJECT_TYPE_CONTACT,
self::OBJECT_TYPE_COMPANY,
];
public function __construct(
private BatchSyncRedisService $redisService
) {
}
/**
* Process batches for a specific object type.
*
* Drains the Redis set for the given object type and config, dispatching Import*Batch
* jobs in batches of 100 until the set is empty or MAX_BATCHES is reached.
*
* @param string $objectType One of: 'deal', 'contact', 'company'
* @param int $configId CRM configuration ID
*
* @return int Total number of IDs dispatched to jobs
*/
public function processBatchesForObjectType(string $objectType, int $configId): int
{
if (! in_array($objectType, self::SUPPORTED_OBJECT_TYPES, true)) {
Log::warning('[WebhookSyncBatchProcessor] Unsupported object type', [
'object_type' => $objectType,
'config_id' => $configId,
]);
return 0;
}
$processedCount = 0;
$batchNumber = 0;
while ($batchNumber < self::MAX_BATCHES) {
try {
$crmProviderIds = $this->redisService->getCollectedObjects(
$objectType,
$configId,
'all',
self::BATCH_SIZE
);
} catch (\Throwable $e) {
Log::error('[WebhookSyncBatchProcessor] Failed to fetch IDs from Redis', [
'object_type' => $objectType,
'config_id' => $configId,
'batch_number' => $batchNumber,
'error' => $e->getMessage(),
]);
break;
}
if (empty($crmProviderIds)) {
break;
}
try {
$this->dispatchBatchJob($objectType, $configId, $crmProviderIds);
$processedCount += \count($crmProviderIds);
$batchNumber++;
} catch (\Throwable $e) {
Log::error('[WebhookSyncBatchProcessor] Batch dispatch failed, stopping', [
'object_type' => $objectType,
'config_id' => $configId,
'batch_number' => $batchNumber,
'batch_size' => \count($crmProviderIds),
'error' => $e->getMessage(),
]);
$this->requeueFailedIds($objectType, $configId, $crmProviderIds);
break;
}
}
if ($batchNumber >= self::MAX_BATCHES) {
Log::warning('[WebhookSyncBatchProcessor] Maximum batch limit reached', [
'object_type' => $objectType,
'config_id' => $configId,
'max_batches' => self::MAX_BATCHES,
'total_dispatched' => $processedCount,
]);
}
if ($processedCount > 0) {
Log::info('[WebhookSyncBatchProcessor] Batch processing completed', [
'object_type' => $objectType,
'config_id' => $configId,
'total_dispatched' => $processedCount,
'batches_dispatched' => $batchNumber,
]);
}
return $processedCount;
}
private function dispatchBatchJob(string $objectType, int $configId, array $crmProviderIds): void
{
match ($objectType) {
self::OBJECT_TYPE_DEAL => ImportOpportunityBatch::dispatch($configId, $crmProviderIds),
self::OBJECT_TYPE_CONTACT => ImportContactBatch::dispatch($configId, $crmProviderIds),
self::OBJECT_TYPE_COMPANY => ImportAccountBatch::dispatch($configId, $crmProviderIds),
};
}
private function requeueFailedIds(string $objectType, int $configId, array $crmProviderIds): void
{
$succeeded = 0;
$permanentlyFailed = [];
foreach ($crmProviderIds as $crmProviderId) {
try {
$this->redisService->collectObjectIdToBatch(
$objectType,
$crmProviderId,
$configId,
'all'
);
$succeeded++;
} catch (\Throwable $idError) {
$permanentlyFailed[] = $crmProviderId;
Log::warning('[WebhookSyncBatchProcessor] Failed to requeue ID', [
'object_type' => $objectType,
'config_id' => $configId,
'crm_provider_id' => $crmProviderId,
'error' => $idError->getMessage(),
]);
}
}
Log::info('[WebhookSyncBatchProcessor] Requeue completed', [
'object_type' => $objectType,
'config_id' => $configId,
'succeeded' => $succeeded,
'failed' => \count($permanentlyFailed),
'total' => \count($crmProviderIds),
]);
if (! empty($permanentlyFailed)) {
Log::error('[WebhookSyncBatchProcessor] Permanently failed to requeue IDs', [
'object_type' => $objectType,
'config_id' => $configId,
'failed_ids' => $permanentlyFailed,
]);
}
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"master, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.034242023,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Editor for custom.log","depth":4,"bounds":{"left":0.5475399,"top":0.0726257,"width":0.44082448,"height":0.9066241},"on_screen":true,"role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"bounds":{"left":0.4950133,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.5049867,"top":0.17478053,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.51396275,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5212766,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Jobs\\Crm\\Hubspot\\ImportAccountBatch;\nuse Jiminny\\Jobs\\Crm\\Hubspot\\ImportContactBatch;\nuse Jiminny\\Jobs\\Crm\\Hubspot\\ImportOpportunityBatch;\n\n/**\n * Processes batches of HubSpot objects collected from webhook events.\n *\n * This service drains Redis sets containing CRM IDs that were collected from webhook\n * property change and association change events. It dispatches Import*Batch jobs to\n * process the objects in batches of 100.\n *\n * Design Decisions:\n *\n * 1. Redis Service Injection:\n * BatchSyncRedisService is injected via constructor for testability and to avoid\n * tight coupling to Redis facade. This allows easy mocking in tests.\n *\n * 2. Multi-Object Type Support:\n * processBatchesForObjectType() directly with their specific object type.\n *\n * 3. Batch Size and Limits:\n * - BATCH_SIZE = 100: HubSpot batch API limit\n * - MAX_BATCHES = 1000: Safety limit to prevent infinite loops (100K objects max per run)\n *\n * 4. Failure Handling:\n * If job dispatch fails, IDs are requeued to Redis for the next processing cycle.\n * Individual job failures are handled by the Import*Batch jobs themselves.\n */\nclass WebhookSyncBatchProcessor\n{\n public const string OBJECT_TYPE_DEAL = 'deal';\n public const string OBJECT_TYPE_CONTACT = 'contact';\n public const string OBJECT_TYPE_COMPANY = 'company';\n private const int BATCH_SIZE = 100;\n private const int MAX_BATCHES = 1000;\n\n private const array SUPPORTED_OBJECT_TYPES = [\n self::OBJECT_TYPE_DEAL,\n self::OBJECT_TYPE_CONTACT,\n self::OBJECT_TYPE_COMPANY,\n ];\n\n public function __construct(\n private BatchSyncRedisService $redisService\n ) {\n }\n\n /**\n * Process batches for a specific object type.\n *\n * Drains the Redis set for the given object type and config, dispatching Import*Batch\n * jobs in batches of 100 until the set is empty or MAX_BATCHES is reached.\n *\n * @param string $objectType One of: 'deal', 'contact', 'company'\n * @param int $configId CRM configuration ID\n *\n * @return int Total number of IDs dispatched to jobs\n */\n public function processBatchesForObjectType(string $objectType, int $configId): int\n {\n if (! in_array($objectType, self::SUPPORTED_OBJECT_TYPES, true)) {\n Log::warning('[WebhookSyncBatchProcessor] Unsupported object type', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n ]);\n\n return 0;\n }\n\n $processedCount = 0;\n $batchNumber = 0;\n\n while ($batchNumber < self::MAX_BATCHES) {\n try {\n $crmProviderIds = $this->redisService->getCollectedObjects(\n $objectType,\n $configId,\n 'all',\n self::BATCH_SIZE\n );\n } catch (\\Throwable $e) {\n Log::error('[WebhookSyncBatchProcessor] Failed to fetch IDs from Redis', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'batch_number' => $batchNumber,\n 'error' => $e->getMessage(),\n ]);\n\n break;\n }\n\n if (empty($crmProviderIds)) {\n break;\n }\n\n try {\n $this->dispatchBatchJob($objectType, $configId, $crmProviderIds);\n\n $processedCount += \\count($crmProviderIds);\n $batchNumber++;\n } catch (\\Throwable $e) {\n Log::error('[WebhookSyncBatchProcessor] Batch dispatch failed, stopping', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'batch_number' => $batchNumber,\n 'batch_size' => \\count($crmProviderIds),\n 'error' => $e->getMessage(),\n ]);\n\n $this->requeueFailedIds($objectType, $configId, $crmProviderIds);\n\n break;\n }\n }\n\n if ($batchNumber >= self::MAX_BATCHES) {\n Log::warning('[WebhookSyncBatchProcessor] Maximum batch limit reached', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'max_batches' => self::MAX_BATCHES,\n 'total_dispatched' => $processedCount,\n ]);\n }\n\n if ($processedCount > 0) {\n Log::info('[WebhookSyncBatchProcessor] Batch processing completed', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'total_dispatched' => $processedCount,\n 'batches_dispatched' => $batchNumber,\n ]);\n }\n\n return $processedCount;\n }\n\n private function dispatchBatchJob(string $objectType, int $configId, array $crmProviderIds): void\n {\n match ($objectType) {\n self::OBJECT_TYPE_DEAL => ImportOpportunityBatch::dispatch($configId, $crmProviderIds),\n self::OBJECT_TYPE_CONTACT => ImportContactBatch::dispatch($configId, $crmProviderIds),\n self::OBJECT_TYPE_COMPANY => ImportAccountBatch::dispatch($configId, $crmProviderIds),\n };\n }\n\n private function requeueFailedIds(string $objectType, int $configId, array $crmProviderIds): void\n {\n $succeeded = 0;\n $permanentlyFailed = [];\n\n foreach ($crmProviderIds as $crmProviderId) {\n try {\n $this->redisService->collectObjectIdToBatch(\n $objectType,\n $crmProviderId,\n $configId,\n 'all'\n );\n $succeeded++;\n } catch (\\Throwable $idError) {\n $permanentlyFailed[] = $crmProviderId;\n Log::warning('[WebhookSyncBatchProcessor] Failed to requeue ID', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'crm_provider_id' => $crmProviderId,\n 'error' => $idError->getMessage(),\n ]);\n }\n }\n\n Log::info('[WebhookSyncBatchProcessor] Requeue completed', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'succeeded' => $succeeded,\n 'failed' => \\count($permanentlyFailed),\n 'total' => \\count($crmProviderIds),\n ]);\n\n if (! empty($permanentlyFailed)) {\n Log::error('[WebhookSyncBatchProcessor] Permanently failed to requeue IDs', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'failed_ids' => $permanentlyFailed,\n ]);\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Jiminny\\Jobs\\Crm\\Hubspot\\ImportAccountBatch;\nuse Jiminny\\Jobs\\Crm\\Hubspot\\ImportContactBatch;\nuse Jiminny\\Jobs\\Crm\\Hubspot\\ImportOpportunityBatch;\n\n/**\n * Processes batches of HubSpot objects collected from webhook events.\n *\n * This service drains Redis sets containing CRM IDs that were collected from webhook\n * property change and association change events. It dispatches Import*Batch jobs to\n * process the objects in batches of 100.\n *\n * Design Decisions:\n *\n * 1. Redis Service Injection:\n * BatchSyncRedisService is injected via constructor for testability and to avoid\n * tight coupling to Redis facade. This allows easy mocking in tests.\n *\n * 2. Multi-Object Type Support:\n * processBatchesForObjectType() directly with their specific object type.\n *\n * 3. Batch Size and Limits:\n * - BATCH_SIZE = 100: HubSpot batch API limit\n * - MAX_BATCHES = 1000: Safety limit to prevent infinite loops (100K objects max per run)\n *\n * 4. Failure Handling:\n * If job dispatch fails, IDs are requeued to Redis for the next processing cycle.\n * Individual job failures are handled by the Import*Batch jobs themselves.\n */\nclass WebhookSyncBatchProcessor\n{\n public const string OBJECT_TYPE_DEAL = 'deal';\n public const string OBJECT_TYPE_CONTACT = 'contact';\n public const string OBJECT_TYPE_COMPANY = 'company';\n private const int BATCH_SIZE = 100;\n private const int MAX_BATCHES = 1000;\n\n private const array SUPPORTED_OBJECT_TYPES = [\n self::OBJECT_TYPE_DEAL,\n self::OBJECT_TYPE_CONTACT,\n self::OBJECT_TYPE_COMPANY,\n ];\n\n public function __construct(\n private BatchSyncRedisService $redisService\n ) {\n }\n\n /**\n * Process batches for a specific object type.\n *\n * Drains the Redis set for the given object type and config, dispatching Import*Batch\n * jobs in batches of 100 until the set is empty or MAX_BATCHES is reached.\n *\n * @param string $objectType One of: 'deal', 'contact', 'company'\n * @param int $configId CRM configuration ID\n *\n * @return int Total number of IDs dispatched to jobs\n */\n public function processBatchesForObjectType(string $objectType, int $configId): int\n {\n if (! in_array($objectType, self::SUPPORTED_OBJECT_TYPES, true)) {\n Log::warning('[WebhookSyncBatchProcessor] Unsupported object type', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n ]);\n\n return 0;\n }\n\n $processedCount = 0;\n $batchNumber = 0;\n\n while ($batchNumber < self::MAX_BATCHES) {\n try {\n $crmProviderIds = $this->redisService->getCollectedObjects(\n $objectType,\n $configId,\n 'all',\n self::BATCH_SIZE\n );\n } catch (\\Throwable $e) {\n Log::error('[WebhookSyncBatchProcessor] Failed to fetch IDs from Redis', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'batch_number' => $batchNumber,\n 'error' => $e->getMessage(),\n ]);\n\n break;\n }\n\n if (empty($crmProviderIds)) {\n break;\n }\n\n try {\n $this->dispatchBatchJob($objectType, $configId, $crmProviderIds);\n\n $processedCount += \\count($crmProviderIds);\n $batchNumber++;\n } catch (\\Throwable $e) {\n Log::error('[WebhookSyncBatchProcessor] Batch dispatch failed, stopping', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'batch_number' => $batchNumber,\n 'batch_size' => \\count($crmProviderIds),\n 'error' => $e->getMessage(),\n ]);\n\n $this->requeueFailedIds($objectType, $configId, $crmProviderIds);\n\n break;\n }\n }\n\n if ($batchNumber >= self::MAX_BATCHES) {\n Log::warning('[WebhookSyncBatchProcessor] Maximum batch limit reached', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'max_batches' => self::MAX_BATCHES,\n 'total_dispatched' => $processedCount,\n ]);\n }\n\n if ($processedCount > 0) {\n Log::info('[WebhookSyncBatchProcessor] Batch processing completed', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'total_dispatched' => $processedCount,\n 'batches_dispatched' => $batchNumber,\n ]);\n }\n\n return $processedCount;\n }\n\n private function dispatchBatchJob(string $objectType, int $configId, array $crmProviderIds): void\n {\n match ($objectType) {\n self::OBJECT_TYPE_DEAL => ImportOpportunityBatch::dispatch($configId, $crmProviderIds),\n self::OBJECT_TYPE_CONTACT => ImportContactBatch::dispatch($configId, $crmProviderIds),\n self::OBJECT_TYPE_COMPANY => ImportAccountBatch::dispatch($configId, $crmProviderIds),\n };\n }\n\n private function requeueFailedIds(string $objectType, int $configId, array $crmProviderIds): void\n {\n $succeeded = 0;\n $permanentlyFailed = [];\n\n foreach ($crmProviderIds as $crmProviderId) {\n try {\n $this->redisService->collectObjectIdToBatch(\n $objectType,\n $crmProviderId,\n $configId,\n 'all'\n );\n $succeeded++;\n } catch (\\Throwable $idError) {\n $permanentlyFailed[] = $crmProviderId;\n Log::warning('[WebhookSyncBatchProcessor] Failed to requeue ID', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'crm_provider_id' => $crmProviderId,\n 'error' => $idError->getMessage(),\n ]);\n }\n }\n\n Log::info('[WebhookSyncBatchProcessor] Requeue completed', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'succeeded' => $succeeded,\n 'failed' => \\count($permanentlyFailed),\n 'total' => \\count($crmProviderIds),\n ]);\n\n if (! empty($permanentlyFailed)) {\n Log::error('[WebhookSyncBatchProcessor] Permanently failed to requeue IDs', [\n 'object_type' => $objectType,\n 'config_id' => $configId,\n 'failed_ids' => $permanentlyFailed,\n ]);\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8010415956189026930
|
-8883631698440123185
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
Editor for custom.log
Sync Changes
Hide This Notification
Code changed:
Hide
8
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use Illuminate\Support\Facades\Log;
use Jiminny\Jobs\Crm\Hubspot\ImportAccountBatch;
use Jiminny\Jobs\Crm\Hubspot\ImportContactBatch;
use Jiminny\Jobs\Crm\Hubspot\ImportOpportunityBatch;
/**
* Processes batches of HubSpot objects collected from webhook events.
*
* This service drains Redis sets containing CRM IDs that were collected from webhook
* property change and association change events. It dispatches Import*Batch jobs to
* process the objects in batches of 100.
*
* Design Decisions:
*
* 1. Redis Service Injection:
* BatchSyncRedisService is injected via constructor for testability and to avoid
* tight coupling to Redis facade. This allows easy mocking in tests.
*
* 2. Multi-Object Type Support:
* processBatchesForObjectType() directly with their specific object type.
*
* 3. Batch Size and Limits:
* - BATCH_SIZE = 100: HubSpot batch API limit
* - MAX_BATCHES = 1000: Safety limit to prevent infinite loops (100K objects max per run)
*
* 4. Failure Handling:
* If job dispatch fails, IDs are requeued to Redis for the next processing cycle.
* Individual job failures are handled by the Import*Batch jobs themselves.
*/
class WebhookSyncBatchProcessor
{
public const string OBJECT_TYPE_DEAL = 'deal';
public const string OBJECT_TYPE_CONTACT = 'contact';
public const string OBJECT_TYPE_COMPANY = 'company';
private const int BATCH_SIZE = 100;
private const int MAX_BATCHES = 1000;
private const array SUPPORTED_OBJECT_TYPES = [
self::OBJECT_TYPE_DEAL,
self::OBJECT_TYPE_CONTACT,
self::OBJECT_TYPE_COMPANY,
];
public function __construct(
private BatchSyncRedisService $redisService
) {
}
/**
* Process batches for a specific object type.
*
* Drains the Redis set for the given object type and config, dispatching Import*Batch
* jobs in batches of 100 until the set is empty or MAX_BATCHES is reached.
*
* @param string $objectType One of: 'deal', 'contact', 'company'
* @param int $configId CRM configuration ID
*
* @return int Total number of IDs dispatched to jobs
*/
public function processBatchesForObjectType(string $objectType, int $configId): int
{
if (! in_array($objectType, self::SUPPORTED_OBJECT_TYPES, true)) {
Log::warning('[WebhookSyncBatchProcessor] Unsupported object type', [
'object_type' => $objectType,
'config_id' => $configId,
]);
return 0;
}
$processedCount = 0;
$batchNumber = 0;
while ($batchNumber < self::MAX_BATCHES) {
try {
$crmProviderIds = $this->redisService->getCollectedObjects(
$objectType,
$configId,
'all',
self::BATCH_SIZE
);
} catch (\Throwable $e) {
Log::error('[WebhookSyncBatchProcessor] Failed to fetch IDs from Redis', [
'object_type' => $objectType,
'config_id' => $configId,
'batch_number' => $batchNumber,
'error' => $e->getMessage(),
]);
break;
}
if (empty($crmProviderIds)) {
break;
}
try {
$this->dispatchBatchJob($objectType, $configId, $crmProviderIds);
$processedCount += \count($crmProviderIds);
$batchNumber++;
} catch (\Throwable $e) {
Log::error('[WebhookSyncBatchProcessor] Batch dispatch failed, stopping', [
'object_type' => $objectType,
'config_id' => $configId,
'batch_number' => $batchNumber,
'batch_size' => \count($crmProviderIds),
'error' => $e->getMessage(),
]);
$this->requeueFailedIds($objectType, $configId, $crmProviderIds);
break;
}
}
if ($batchNumber >= self::MAX_BATCHES) {
Log::warning('[WebhookSyncBatchProcessor] Maximum batch limit reached', [
'object_type' => $objectType,
'config_id' => $configId,
'max_batches' => self::MAX_BATCHES,
'total_dispatched' => $processedCount,
]);
}
if ($processedCount > 0) {
Log::info('[WebhookSyncBatchProcessor] Batch processing completed', [
'object_type' => $objectType,
'config_id' => $configId,
'total_dispatched' => $processedCount,
'batches_dispatched' => $batchNumber,
]);
}
return $processedCount;
}
private function dispatchBatchJob(string $objectType, int $configId, array $crmProviderIds): void
{
match ($objectType) {
self::OBJECT_TYPE_DEAL => ImportOpportunityBatch::dispatch($configId, $crmProviderIds),
self::OBJECT_TYPE_CONTACT => ImportContactBatch::dispatch($configId, $crmProviderIds),
self::OBJECT_TYPE_COMPANY => ImportAccountBatch::dispatch($configId, $crmProviderIds),
};
}
private function requeueFailedIds(string $objectType, int $configId, array $crmProviderIds): void
{
$succeeded = 0;
$permanentlyFailed = [];
foreach ($crmProviderIds as $crmProviderId) {
try {
$this->redisService->collectObjectIdToBatch(
$objectType,
$crmProviderId,
$configId,
'all'
);
$succeeded++;
} catch (\Throwable $idError) {
$permanentlyFailed[] = $crmProviderId;
Log::warning('[WebhookSyncBatchProcessor] Failed to requeue ID', [
'object_type' => $objectType,
'config_id' => $configId,
'crm_provider_id' => $crmProviderId,
'error' => $idError->getMessage(),
]);
}
}
Log::info('[WebhookSyncBatchProcessor] Requeue completed', [
'object_type' => $objectType,
'config_id' => $configId,
'succeeded' => $succeeded,
'failed' => \count($permanentlyFailed),
'total' => \count($crmProviderIds),
]);
if (! empty($permanentlyFailed)) {
Log::error('[WebhookSyncBatchProcessor] Permanently failed to requeue IDs', [
'object_type' => $objectType,
'config_id' => $configId,
'failed_ids' => $permanentlyFailed,
]);
}
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
26342
|
1092
|
13
|
2026-05-12T12:21:35.184522+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778588495184_m1.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.49027777,"top":0.033333335,"width":0.01875,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-8009599440207839236
|
-5807833556681052111
|
visual_change
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
26343
|
1093
|
11
|
2026-05-12T12:21:37.475804+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778588497475_m2.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.33759972,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33959442,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.40492022,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4069149,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.4722407,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4742354,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.53956115,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5415558,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.60671544,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6087101,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.67386967,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.67586434,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.5049867,"top":1.0,"width":0.008976064,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-8009599440207839236
|
-5807833556681052111
|
click
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
26344
|
1093
|
12
|
2026-05-12T12:22:07.623560+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778588527623_m2.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.33759972,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33959442,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.40492022,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4069149,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.4722407,"top":1.0,"width":0.06732048,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4742354,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.53956115,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5415558,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.60671544,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6087101,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.67386967,"top":1.0,"width":0.06715426,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.67586434,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.5049867,"top":1.0,"width":0.008976064,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-8009599440207839236
|
-5807833556681052111
|
idle
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
26343
|
NULL
|
NULL
|
NULL
|
|
26345
|
1092
|
14
|
2026-05-12T12:22:08.213155+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778588528213_m1.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.140625,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.14479166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.28125,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.28541666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.421875,"top":0.05888889,"width":0.140625,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42604166,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5625,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56666666,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.7027778,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.70694447,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.84305555,"top":0.05888889,"width":0.14027777,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8472222,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.49027777,"top":0.033333335,"width":0.01875,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-8009599440207839236
|
-5807833556681052111
|
idle
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
26342
|
NULL
|
NULL
|
NULL
|
|
26353
|
1092
|
19
|
2026-05-12T12:22:42.361265+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778588562361_m1.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.49027777,"top":0.033333335,"width":0.01875,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-8009599440207839236
|
-5807833556681052111
|
click
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
26354
|
1093
|
16
|
2026-05-12T12:22:42.347443+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778588562347_m2.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.32912233,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33111703,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.3879654,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3899601,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.44680852,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4488032,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.56449467,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56648934,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.62333775,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.6253325,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.6821808,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.68417555,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7273936,"top":1.0,"width":0.01861702,"height":-0.023144484},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.5049867,"top":1.0,"width":0.008976064,"height":-0.02394259},"on_screen":true,"role_description":"text"}]...
|
-8009599440207839236
|
-5807833556681052111
|
click
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
26382
|
1092
|
36
|
2026-05-12T12:24:43.031706+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778588683031_m1.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.36875,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.37291667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49166667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49583334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6145833,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.61875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ssh","depth":2,"bounds":{"left":0.7375,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.7416667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.86041665,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.8645833,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.9548611,"top":0.032222223,"width":0.03888889,"height":0.018888889},"on_screen":true,"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"ssh","depth":1,"bounds":{"left":0.49027777,"top":0.033333335,"width":0.01875,"height":0.017777778},"on_screen":true,"role_description":"text"}]...
|
-8009599440207839236
|
-5807833556681052111
|
click
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
26385
|
1092
|
38
|
2026-05-12T12:25:15.545332+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778588715545_m1.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","is_focused":true}]...
|
-8009599440207839236
|
-5807833556681052111
|
click
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
26386
|
1093
|
29
|
2026-05-12T12:25:15.557346+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778588715557_m2.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.32912233,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33111703,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.3879654,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3899601,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"ec2-user@ip-10-30-129-190:~ (-zsh)","depth":2,"bounds":{"left":0.44680852,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.4488032,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5056516,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.50764626,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.56449467,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.56648934,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8009599440207839236
|
-5807833556681052111
|
click
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
26384
|
NULL
|
NULL
|
NULL
|
|
26389
|
1094
|
0
|
2026-05-12T12:25:24.820847+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778588724820_m1.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.12291667,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.12708333,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.24583334,"top":0.05888889,"width":0.12291667,"height":0.026666667},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.25,"top":0.06333333,"width":0.011111111,"height":0.017777778},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8009599440207839236
|
-5807833556681052111
|
click
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
26390
|
1095
|
0
|
2026-05-12T12:25:24.851878+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778588724851_m2.jpg...
|
iTerm2
|
ssh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","depth":4,"on_screen":true,"value":"-rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4\n-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4\n-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4\n-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4\n-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4\n-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4\n-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4\n-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4\n-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4\n-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4\n-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4\n-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4\n-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4\n-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4\n-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4\n-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4\n-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4\n-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4\n-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4\n-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4\n-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4\n-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4\n-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4\n-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4\n-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4\n-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4\n-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4\n-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4\n-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4\n-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4\n-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4\n-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4\n-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4\n-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4\n-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4\n-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4\n-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4\n-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4\n-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4\n-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4\n-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4\n-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4\n-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4\n-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-55-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:56 System Audio (output)_2026-05-11_11-56-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-56-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:57 System Audio (output)_2026-05-11_11-57-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-57-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:58 System Audio (output)_2026-05-11_11-58-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 14:59 System Audio (output)_2026-05-11_11-58-41.mp4\n-rw-r--r-- 1 lukas staff 21050 11 May 14:59 System Audio (output)_2026-05-11_11-59-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 14:59 System Audio (output)_2026-05-11_11-59-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_11-59-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:00 System Audio (output)_2026-05-11_12-00-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:00 System Audio (output)_2026-05-11_12-00-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-00-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:01 System Audio (output)_2026-05-11_12-01-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-01-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:02 System Audio (output)_2026-05-11_12-02-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-02-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:03 System Audio (output)_2026-05-11_12-03-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:03 System Audio (output)_2026-05-11_12-03-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:04 System Audio (output)_2026-05-11_12-03-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:04 System Audio (output)_2026-05-11_12-04-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-04-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:05 System Audio (output)_2026-05-11_12-05-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-05-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:06 System Audio (output)_2026-05-11_12-06-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:07 System Audio (output)_2026-05-11_12-06-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:07 System Audio (output)_2026-05-11_12-07-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-07-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:08 System Audio (output)_2026-05-11_12-08-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:08 System Audio (output)_2026-05-11_12-08-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-08-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:09 System Audio (output)_2026-05-11_12-09-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:09 System Audio (output)_2026-05-11_12-09-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:10 System Audio (output)_2026-05-11_12-09-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:10 System Audio (output)_2026-05-11_12-10-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-10-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:11 System Audio (output)_2026-05-11_12-11-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:11 System Audio (output)_2026-05-11_12-11-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:12 System Audio (output)_2026-05-11_12-11-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:12 System Audio (output)_2026-05-11_12-12-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-12-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:13 System Audio (output)_2026-05-11_12-13-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-13-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:14 System Audio (output)_2026-05-11_12-14-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:14 System Audio (output)_2026-05-11_12-14-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-14-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:15 System Audio (output)_2026-05-11_12-15-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:15 System Audio (output)_2026-05-11_12-15-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-15-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:16 System Audio (output)_2026-05-11_12-16-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:17 System Audio (output)_2026-05-11_12-16-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:17 System Audio (output)_2026-05-11_12-17-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-17-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:18 System Audio (output)_2026-05-11_12-18-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:19 System Audio (output)_2026-05-11_12-18-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:19 System Audio (output)_2026-05-11_12-19-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-19-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:20 System Audio (output)_2026-05-11_12-20-28.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-20-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:21 System Audio (output)_2026-05-11_12-21-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:21 System Audio (output)_2026-05-11_12-21-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-21-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:22 System Audio (output)_2026-05-11_12-22-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-22-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:23 System Audio (output)_2026-05-11_12-23-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-23-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:24 System Audio (output)_2026-05-11_12-24-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:24 System Audio (output)_2026-05-11_12-24-35.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-24-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:25 System Audio (output)_2026-05-11_12-25-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-25-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:26 System Audio (output)_2026-05-11_12-26-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:26 System Audio (output)_2026-05-11_12-26-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-26-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:27 System Audio (output)_2026-05-11_12-27-12.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:27 System Audio (output)_2026-05-11_12-27-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:28 System Audio (output)_2026-05-11_12-27-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:28 System Audio (output)_2026-05-11_12-28-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-28-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:29 System Audio (output)_2026-05-11_12-29-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:30 System Audio (output)_2026-05-11_12-29-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:30 System Audio (output)_2026-05-11_12-30-33.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:31 System Audio (output)_2026-05-11_12-30-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:31 System Audio (output)_2026-05-11_12-31-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:32 System Audio (output)_2026-05-11_12-31-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:32 System Audio (output)_2026-05-11_12-32-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:33 System Audio (output)_2026-05-11_12-32-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:33 System Audio (output)_2026-05-11_12-33-11.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-33-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:34 System Audio (output)_2026-05-11_12-33-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:34 System Audio (output)_2026-05-11_12-34-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-34-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:35 System Audio (output)_2026-05-11_12-35-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:35 System Audio (output)_2026-05-11_12-35-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-35-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:36 System Audio (output)_2026-05-11_12-36-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:37 System Audio (output)_2026-05-11_12-36-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:37 System Audio (output)_2026-05-11_12-37-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-37-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:38 System Audio (output)_2026-05-11_12-38-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:39 System Audio (output)_2026-05-11_12-39-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:39 System Audio (output)_2026-05-11_12-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-39-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:40 System Audio (output)_2026-05-11_12-40-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:41 System Audio (output)_2026-05-11_12-41-06.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:41 System Audio (output)_2026-05-11_12-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:42 System Audio (output)_2026-05-11_12-42-13.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:42 System Audio (output)_2026-05-11_12-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:43 System Audio (output)_2026-05-11_12-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:44 System Audio (output)_2026-05-11_12-44-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:44 System Audio (output)_2026-05-11_12-44-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-44-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:45 System Audio (output)_2026-05-11_12-45-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:45 System Audio (output)_2026-05-11_12-45-36.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:46 System Audio (output)_2026-05-11_12-45-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:46 System Audio (output)_2026-05-11_12-46-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:47 System Audio (output)_2026-05-11_12-46-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:47 System Audio (output)_2026-05-11_12-47-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-47-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:48 System Audio (output)_2026-05-11_12-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:48 System Audio (output)_2026-05-11_12-48-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-48-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:49 System Audio (output)_2026-05-11_12-49-19.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:50 System Audio (output)_2026-05-11_12-49-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:50 System Audio (output)_2026-05-11_12-50-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:51 System Audio (output)_2026-05-11_12-50-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:51 System Audio (output)_2026-05-11_12-51-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:52 System Audio (output)_2026-05-11_12-51-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:52 System Audio (output)_2026-05-11_12-52-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-52-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:53 System Audio (output)_2026-05-11_12-53-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-53-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:54 System Audio (output)_2026-05-11_12-54-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 15:55 System Audio (output)_2026-05-11_12-54-56.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:55 System Audio (output)_2026-05-11_12-55-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-55-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:56 System Audio (output)_2026-05-11_12-56-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-56-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:57 System Audio (output)_2026-05-11_12-57-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-57-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:58 System Audio (output)_2026-05-11_12-58-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-58-39.mp4\n-rw-r--r-- 1 lukas staff 21450 11 May 15:59 System Audio (output)_2026-05-11_12-59-02.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 15:59 System Audio (output)_2026-05-11_12-59-24.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_12-59-46.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:00 System Audio (output)_2026-05-11_13-00-31.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:01 System Audio (output)_2026-05-11_13-00-53.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:01 System Audio (output)_2026-05-11_13-01-15.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-01-38.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:02 System Audio (output)_2026-05-11_13-02-00.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:02 System Audio (output)_2026-05-11_13-02-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-02-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-07.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:03 System Audio (output)_2026-05-11_13-03-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-03-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:04 System Audio (output)_2026-05-11_13-04-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-04-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:05 System Audio (output)_2026-05-11_13-05-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-05-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:06 System Audio (output)_2026-05-11_13-06-27.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-06-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:07 System Audio (output)_2026-05-11_13-07-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:07 System Audio (output)_2026-05-11_13-07-34.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:08 System Audio (output)_2026-05-11_13-07-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:08 System Audio (output)_2026-05-11_13-08-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-08-41.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:09 System Audio (output)_2026-05-11_13-09-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:09 System Audio (output)_2026-05-11_13-09-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-09-48.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:10 System Audio (output)_2026-05-11_13-10-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:10 System Audio (output)_2026-05-11_13-10-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:11 System Audio (output)_2026-05-11_13-10-54.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:11 System Audio (output)_2026-05-11_13-11-17.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-11-39.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-01.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:12 System Audio (output)_2026-05-11_13-12-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-12-45.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:13 System Audio (output)_2026-05-11_13-13-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-13-52.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:14 System Audio (output)_2026-05-11_13-14-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-14-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:15 System Audio (output)_2026-05-11_13-15-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-15-44.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:16 System Audio (output)_2026-05-11_13-16-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:16 System Audio (output)_2026-05-11_13-16-29.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-16-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:17 System Audio (output)_2026-05-11_13-17-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:17 System Audio (output)_2026-05-11_13-17-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:18 System Audio (output)_2026-05-11_13-17-58.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:18 System Audio (output)_2026-05-11_13-18-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-18-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:19 System Audio (output)_2026-05-11_13-19-05.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:19 System Audio (output)_2026-05-11_13-19-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-19-50.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:20 System Audio (output)_2026-05-11_13-20-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:20 System Audio (output)_2026-05-11_13-20-35.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:21 System Audio (output)_2026-05-11_13-20-57.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:21 System Audio (output)_2026-05-11_13-21-20.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-21-42.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:22 System Audio (output)_2026-05-11_13-22-04.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:22 System Audio (output)_2026-05-11_13-22-26.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-22-49.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-11.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:23 System Audio (output)_2026-05-11_13-23-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:24 System Audio (output)_2026-05-11_13-23-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:24 System Audio (output)_2026-05-11_13-24-18.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-24-40.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:25 System Audio (output)_2026-05-11_13-25-03.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:25 System Audio (output)_2026-05-11_13-25-25.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:26 System Audio (output)_2026-05-11_13-25-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:26 System Audio (output)_2026-05-11_13-26-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-26-55.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:27 System Audio (output)_2026-05-11_13-27-17.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-27-40.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:28 System Audio (output)_2026-05-11_13-28-02.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:28 System Audio (output)_2026-05-11_13-28-25.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-28-47.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-09.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:29 System Audio (output)_2026-05-11_13-29-32.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-29-54.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:30 System Audio (output)_2026-05-11_13-30-16.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:31 System Audio (output)_2026-05-11_13-30-38.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-01.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:31 System Audio (output)_2026-05-11_13-31-23.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-31-45.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:32 System Audio (output)_2026-05-11_13-32-08.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:32 System Audio (output)_2026-05-11_13-32-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:33 System Audio (output)_2026-05-11_13-32-52.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:33 System Audio (output)_2026-05-11_13-33-37.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-33-59.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:34 System Audio (output)_2026-05-11_13-34-21.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:35 System Audio (output)_2026-05-11_13-34-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:35 System Audio (output)_2026-05-11_13-35-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-35-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:36 System Audio (output)_2026-05-11_13-36-37.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-36-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:37 System Audio (output)_2026-05-11_13-37-22.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-37-44.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:38 System Audio (output)_2026-05-11_13-38-29.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-38-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:39 System Audio (output)_2026-05-11_13-39-14.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:39 System Audio (output)_2026-05-11_13-39-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-39-59.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:40 System Audio (output)_2026-05-11_13-40-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-40-43.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-06.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:41 System Audio (output)_2026-05-11_13-41-28.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-41-51.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:42 System Audio (output)_2026-05-11_13-42-13.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-36.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-42-58.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:43 System Audio (output)_2026-05-11_13-43-21.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-43-43.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:44 System Audio (output)_2026-05-11_13-44-05.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:44 System Audio (output)_2026-05-11_13-44-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-44-50.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:45 System Audio (output)_2026-05-11_13-45-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:46 System Audio (output)_2026-05-11_13-45-57.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:46 System Audio (output)_2026-05-11_13-46-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-46-42.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:47 System Audio (output)_2026-05-11_13-47-04.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:47 System Audio (output)_2026-05-11_13-47-27.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-47-49.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:48 System Audio (output)_2026-05-11_13-48-12.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:48 System Audio (output)_2026-05-11_13-48-34.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:49 System Audio (output)_2026-05-11_13-48-56.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:49 System Audio (output)_2026-05-11_13-49-19.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-49-41.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:50 System Audio (output)_2026-05-11_13-50-03.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:50 System Audio (output)_2026-05-11_13-50-26.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 16:51 System Audio (output)_2026-05-11_13-50-48.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-10.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:51 System Audio (output)_2026-05-11_13-51-33.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 16:52 System Audio (output)_2026-05-11_13-51-55.mp4\ndrwxr-xr-x 9 lukas staff 288 11 May 07:54 data\ndrwxr-xr-x 2 lukas staff 64 11 May 15:48 pending-transcriptions\n-rw-r--r-- 1 lukas staff 29419 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-10-32.mp4\n-rw-r--r-- 1 lukas staff 56479 10 May 14:11 soundcore AeroClip (input)_2026-05-10_11-11-05.mp4\n-rw-r--r--@ 1 lukas staff 181831 10 May 14:12 soundcore AeroClip (input)_2026-05-10_11-11-35.mp4\n-rw-r--r-- 1 lukas staff 149782 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-42-53.mp4\n-rw-r--r-- 1 lukas staff 91059 10 May 14:43 soundcore AeroClip (input)_2026-05-10_11-43-25.mp4\n-rw-r--r-- 1 lukas staff 30604 10 May 14:44 soundcore AeroClip (input)_2026-05-10_11-44-25.mp4\n-rw-r--r-- 1 lukas staff 93813 10 May 14:45 soundcore AeroClip (input)_2026-05-10_11-44-55.mp4\n-rw-r--r-- 1 lukas staff 40444 10 May 21:11 soundcore AeroClip (input)_2026-05-10_18-11-18.mp4\n-rw-r--r-- 1 lukas staff 193020 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-11-48.mp4\n-rw-r--r-- 1 lukas staff 218460 10 May 21:12 soundcore AeroClip (input)_2026-05-10_18-12-18.mp4\n-rw-r--r-- 1 lukas staff 168343 10 May 21:13 soundcore AeroClip (input)_2026-05-10_18-12-48.mp4\n-rw-r--r-- 1 lukas staff 108457 10 May 21:16 soundcore AeroClip (input)_2026-05-10_18-16-18.mp4\n-rw-r--r-- 1 lukas staff 206580 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-16-48.mp4\n-rw-r--r-- 1 lukas staff 173748 10 May 21:17 soundcore AeroClip (input)_2026-05-10_18-17-18.mp4\n-rw-r--r-- 1 lukas staff 121991 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-18-48.mp4\n-rw-r--r-- 1 lukas staff 62738 10 May 21:19 soundcore AeroClip (input)_2026-05-10_18-19-18.mp4\n-rw-r--r-- 1 lukas staff 76474 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-19-48.mp4\n-rw-r--r-- 1 lukas staff 34366 10 May 21:20 soundcore AeroClip (input)_2026-05-10_18-20-18.mp4\n-rw-r--r-- 1 lukas staff 31972 10 May 21:21 soundcore AeroClip (input)_2026-05-10_18-21-18.mp4\n-rw-r--r-- 1 lukas staff 85887 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-21-48.mp4\n-rw-r--r-- 1 lukas staff 204874 10 May 21:22 soundcore AeroClip (input)_2026-05-10_18-22-18.mp4\n-rw-r--r-- 1 lukas staff 212074 10 May 21:23 soundcore AeroClip (input)_2026-05-10_18-22-48.mp4\n-rw-r--r-- 1 lukas staff 66483 10 May 21:24 soundcore AeroClip (input)_2026-05-10_18-24-18.mp4\n-rw-r--r-- 1 lukas staff 36049 10 May 21:29 soundcore AeroClip (input)_2026-05-10_18-29-08.mp4\n-rw-r--r-- 1 lukas staff 54646 10 May 21:30 soundcore AeroClip (input)_2026-05-10_18-30-08.mp4\n-rw-r--r-- 1 lukas staff 69996 10 May 21:31 soundcore AeroClip (input)_2026-05-10_18-30-38.mp4\n-rw-r--r-- 1 lukas staff 90765 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-31-38.mp4\n-rw-r--r-- 1 lukas staff 145150 10 May 21:32 soundcore AeroClip (input)_2026-05-10_18-32-08.mp4\n-rw-r--r-- 1 lukas staff 76582 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-32-38.mp4\n-rw-r--r-- 1 lukas staff 91200 10 May 21:33 soundcore AeroClip (input)_2026-05-10_18-33-08.mp4\n-rw-r--r-- 1 lukas staff 173940 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-33-38.mp4\n-rw-r--r-- 1 lukas staff 113036 10 May 21:34 soundcore AeroClip (input)_2026-05-10_18-34-08.mp4\n-rw-r--r-- 1 lukas staff 128287 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-34-38.mp4\n-rw-r--r-- 1 lukas staff 68218 10 May 21:35 soundcore AeroClip (input)_2026-05-10_18-35-08.mp4\n-rw-r--r-- 1 lukas staff 135683 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-35-38.mp4\n-rw-r--r-- 1 lukas staff 99704 10 May 21:36 soundcore AeroClip (input)_2026-05-10_18-36-08.mp4\n-rw-r--r-- 1 lukas staff 142027 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-36-38.mp4\n-rw-r--r-- 1 lukas staff 106127 10 May 21:37 soundcore AeroClip (input)_2026-05-10_18-37-08.mp4\n-rw-r--r-- 1 lukas staff 118972 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-37-38.mp4\n-rw-r--r-- 1 lukas staff 110153 10 May 21:38 soundcore AeroClip (input)_2026-05-10_18-38-08.mp4\n-rw-r--r-- 1 lukas staff 124144 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-38-38.mp4\n-rw-r--r-- 1 lukas staff 145103 10 May 21:39 soundcore AeroClip (input)_2026-05-10_18-39-08.mp4\n-rw-r--r-- 1 lukas staff 128066 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-39-38.mp4\n-rw-r--r-- 1 lukas staff 115915 10 May 21:40 soundcore AeroClip (input)_2026-05-10_18-40-08.mp4\n-rw-r--r-- 1 lukas staff 151423 10 May 21:41 soundcore AeroClip (input)_2026-05-10_18-40-38.mp4\n-rw-r--r-- 1 lukas staff 153224 10 May 21:50 soundcore AeroClip (input)_2026-05-10_18-49-39.mp4\n-rw-r--r-- 1 lukas staff 27509 11 May 07:55 soundcore AeroClip (input)_2026-05-11_04-54-38.mp4\n-rw-r--r-- 1 lukas staff 29576 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-06-49.mp4\n-rw-r--r-- 1 lukas staff 100760 11 May 09:07 soundcore AeroClip (input)_2026-05-11_06-07-21.mp4\n-rw-r--r-- 1 lukas staff 36750 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-07-51.mp4\n-rw-r--r-- 1 lukas staff 79544 11 May 09:08 soundcore AeroClip (input)_2026-05-11_06-08-21.mp4\n-rw-r--r-- 1 lukas staff 78649 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-08-51.mp4\n-rw-r--r-- 1 lukas staff 70160 11 May 09:09 soundcore AeroClip (input)_2026-05-11_06-09-21.mp4\n-rw-r--r-- 1 lukas staff 30879 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-09-51.mp4\n-rw-r--r-- 1 lukas staff 68016 11 May 09:10 soundcore AeroClip (input)_2026-05-11_06-10-21.mp4\n-rw-r--r-- 1 lukas staff 32996 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-10-51.mp4\n-rw-r--r-- 1 lukas staff 17101 11 May 09:11 soundcore AeroClip (input)_2026-05-11_06-11-21.mp4\n-rw-r--r-- 1 lukas staff 6005 11 May 09:12 soundcore AeroClip (input)_2026-05-11_06-12-14.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-12-49.mp4\n-rw-r--r-- 1 lukas staff 5613 11 May 09:13 soundcore AeroClip (input)_2026-05-11_06-13-21.mp4\n-rw-r--r-- 1 lukas staff 7607 11 May 09:14 soundcore AeroClip (input)_2026-05-11_06-13-58.mp4\n-rw-r--r-- 1 lukas staff 10476 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-14-30.mp4\n-rw-r--r-- 1 lukas staff 8378 11 May 09:15 soundcore AeroClip (input)_2026-05-11_06-15-00.mp4\n-rw-r--r-- 1 lukas staff 23989 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-15-30.mp4\n-rw-r--r-- 1 lukas staff 20245 11 May 09:16 soundcore AeroClip (input)_2026-05-11_06-16-00.mp4\n-rw-r--r-- 1 lukas staff 55920 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-16-30.mp4\n-rw-r--r-- 1 lukas staff 106555 11 May 09:17 soundcore AeroClip (input)_2026-05-11_06-17-00.mp4\n-rw-r--r-- 1 lukas staff 128293 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-17-30.mp4\n-rw-r--r-- 1 lukas staff 131841 11 May 09:18 soundcore AeroClip (input)_2026-05-11_06-18-00.mp4\n-rw-r--r-- 1 lukas staff 102940 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-18-30.mp4\n-rw-r--r-- 1 lukas staff 32693 11 May 09:19 soundcore AeroClip (input)_2026-05-11_06-19-00.mp4\n-rw-r--r-- 1 lukas staff 73250 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-19-30.mp4\n-rw-r--r-- 1 lukas staff 55261 11 May 09:20 soundcore AeroClip (input)_2026-05-11_06-20-00.mp4\n-rw-r--r-- 1 lukas staff 44782 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-20-30.mp4\n-rw-r--r-- 1 lukas staff 53024 11 May 09:21 soundcore AeroClip (input)_2026-05-11_06-21-00.mp4\n-rw-r--r-- 1 lukas staff 20139 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-21-30.mp4\n-rw-r--r-- 1 lukas staff 12416 11 May 09:22 soundcore AeroClip (input)_2026-05-11_06-22-00.mp4\n-rw-r--r-- 1 lukas staff 9670 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-22-30.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:23 soundcore AeroClip (input)_2026-05-11_06-23-19.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-23-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:24 soundcore AeroClip (input)_2026-05-11_06-24-21.mp4\n-rw-r--r-- 1 lukas staff 5636 11 May 09:25 soundcore AeroClip (input)_2026-05-11_06-24-51.mp4\n-rw-r--r-- 1 lukas staff 4628 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-25-43.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:26 soundcore AeroClip (input)_2026-05-11_06-26-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-26-45.mp4\n-rw-r--r-- 1 lukas staff 4612 11 May 09:27 soundcore AeroClip (input)_2026-05-11_06-27-15.mp4\n-rw-r--r-- 1 lukas staff 5559 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-27-45.mp4\n-rw-r--r-- 1 lukas staff 5626 11 May 09:28 soundcore AeroClip (input)_2026-05-11_06-28-15.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-28-50.mp4\n-rw-r--r-- 1 lukas staff 8817 11 May 09:29 soundcore AeroClip (input)_2026-05-11_06-29-22.mp4\n-rw-r--r-- 1 lukas staff 5812 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-29-52.mp4\n-rw-r--r-- 1 lukas staff 5671 11 May 09:30 soundcore AeroClip (input)_2026-05-11_06-30-22.mp4\n-rw-r--r-- 1 lukas staff 7963 11 May 09:31 soundcore AeroClip (input)_2026-05-11_06-31-11.mp4\n-rw-r--r-- 1 lukas staff 6614 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-31-43.mp4\n-rw-r--r-- 1 lukas staff 5606 11 May 09:32 soundcore AeroClip (input)_2026-05-11_06-32-20.mp4\n-rw-r--r-- 1 lukas staff 6390 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-32-52.mp4\n-rw-r--r-- 1 lukas staff 60313 11 May 09:33 soundcore AeroClip (input)_2026-05-11_06-33-22.mp4\n-rw-r--r-- 1 lukas staff 88433 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-33-52.mp4\n-rw-r--r-- 1 lukas staff 125249 11 May 09:34 soundcore AeroClip (input)_2026-05-11_06-34-22.mp4\n-rw-r--r-- 1 lukas staff 102975 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-34-52.mp4\n-rw-r--r-- 1 lukas staff 21399 11 May 09:35 soundcore AeroClip (input)_2026-05-11_06-35-22.mp4\n-rw-r--r-- 1 lukas staff 39379 11 May 09:36 soundcore AeroClip (input)_2026-05-11_06-35-52.mp4\n-rw-r--r-- 1 lukas staff 9957 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-36-46.mp4\n-rw-r--r-- 1 lukas staff 88148 11 May 09:37 soundcore AeroClip (input)_2026-05-11_06-37-18.mp4\n-rw-r--r-- 1 lukas staff 135840 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-37-48.mp4\n-rw-r--r-- 1 lukas staff 34770 11 May 09:38 soundcore AeroClip (input)_2026-05-11_06-38-18.mp4\n-rw-r--r-- 1 lukas staff 52737 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-38-48.mp4\n-rw-r--r-- 1 lukas staff 70070 11 May 09:39 soundcore AeroClip (input)_2026-05-11_06-39-18.mp4\n-rw-r--r-- 1 lukas staff 50628 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-39-48.mp4\n-rw-r--r-- 1 lukas staff 76838 11 May 09:40 soundcore AeroClip (input)_2026-05-11_06-40-18.mp4\n-rw-r--r-- 1 lukas staff 66733 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-40-48.mp4\n-rw-r--r-- 1 lukas staff 77887 11 May 09:41 soundcore AeroClip (input)_2026-05-11_06-41-18.mp4\n-rw-r--r-- 1 lukas staff 63922 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-41-48.mp4\n-rw-r--r-- 1 lukas staff 18884 11 May 09:42 soundcore AeroClip (input)_2026-05-11_06-42-18.mp4\n-rw-r--r-- 1 lukas staff 13942 11 May 09:43 soundcore AeroClip (input)_2026-05-11_06-42-56.mp4\n-rw-r--r-- 1 lukas staff 5650 11 May 09:44 soundcore AeroClip (input)_2026-05-11_06-43-53.mp4\n-rw-r--r-- 1 lukas staff 4620 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-44-38.mp4\n-rw-r--r-- 1 lukas staff 6851 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-10.mp4\n-rw-r--r-- 1 lukas staff 1107 11 May 09:45 soundcore AeroClip (input)_2026-05-11_06-45-22.mp4\n-rw-r--r-- 1 lukas staff 17800 11 May 19:18 soundcore AeroClip (input)_2026-05-11_16-18-23.mp4\n-rw-r--r-- 1 lukas staff 12732 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-18-54.mp4\n-rw-r--r-- 1 lukas staff 7361 11 May 19:19 soundcore AeroClip (input)_2026-05-11_16-19-24.mp4\n-rw-r--r-- 1 lukas staff 16622 11 May 19:20 soundcore AeroClip (input)_2026-05-11_16-19-54.mp4\n-rw-r--r-- 1 lukas staff 150936 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-20-29.mp4\n-rw-r--r-- 1 lukas staff 134732 11 May 19:21 soundcore AeroClip (input)_2026-05-11_16-21-01.mp4\n-rw-r--r-- 1 lukas staff 23690 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-21-31.mp4\n-rw-r--r-- 1 lukas staff 16651 11 May 19:22 soundcore AeroClip (input)_2026-05-11_16-22-01.mp4\n-rw-r--r-- 1 lukas staff 6922 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-22-31.mp4\n-rw-r--r-- 1 lukas staff 5603 11 May 19:23 soundcore AeroClip (input)_2026-05-11_16-23-01.mp4\n-rw-r--r-- 1 lukas staff 49509 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-23-31.mp4\n-rw-r--r-- 1 lukas staff 34462 11 May 19:24 soundcore AeroClip (input)_2026-05-11_16-24-01.mp4\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe/data $ cd .. \nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/.screenpipe $ nas\nAdm1n@DXP4800PLUS-B5F8:~$ cd /volume1/screenpipe/\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ll\ntotal 26G\ndrwxrwxrwx+ 1 root root 410 May 12 15:15 .\ndrwxr-xr-x 1 root root 450 Apr 25 19:39 ..\ndrwxrwxrwx+ 1 Adm1n admin 202 Apr 26 20:10 app\ndrwxrwxrwx+ 1 Adm1n admin 298 May 10 13:46 data\ndrwxrwxrwx+ 1 Adm1n admin 144 May 9 09:41 .git\ndrwxrwxrwx+ 1 Adm1n admin 70 May 10 13:47 logs\ndrwxrwxrwx+ 1 Adm1n admin 164 Apr 11 16:51 pipes\ndrwxrwxrwx+ 1 root root 5.1K May 11 20:55 '#recycle'\n-rwxrwxrwx+ 1 root root 31 Apr 18 17:42 app_settings.json\n-rwxrwxrwx+ 1 Adm1n admin 13G May 11 20:55 archive.db\n-rwxrwxrwx+ 1 Adm1n admin 11G May 10 12:31 archive.db-bak\n-rwxrwxrwx+ 1 Adm1n admin 3.5G May 11 20:15 db.sqlite\n-rwxrwxrwx+ 1 Adm1n admin 32K May 12 05:48 db.sqlite-shm\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 26 17:17 db.sqlite-wal\n-rwxrwxrwx+ 1 Adm1n admin 11K May 12 09:09 .DS_Store\n-rwxrwxrwx+ 1 Adm1n admin 219 Apr 24 19:33 .gitignore\n-rwxrwxrwx+ 1 Adm1n admin 0 Apr 13 17:21 screenpipe.db\n-rwxrwxrwx+ 1 Adm1n admin 8.4K May 12 15:15 screenpipe_fts_migrate.sh\n-rwxrwxrwx+ 1 Adm1n admin 32K May 11 20:48 screenpipe_sync.sh\n-rwxrwxrwx+ 1 Adm1n admin 20K May 10 13:06 screenpipe_sync_updated.sh\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ cp archive.db archive.db.bak-pre-installid\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$ ./screenpipe_fts_migrate.sh archive.db\n================================================\nScreenpipe FTS migration\nDB: archive.db\nSize: 13G\n================================================\n\n▶ Creating install registry\n _installs table ✓ 0m01s\n\n▶ Adding install_id to base tables\n video_chunks already present\nError: stepping, UNIQUE constraint failed: video_chunks.install_id, video_chunks.id (19)\nAdm1n@DXP4800PLUS-B5F8:/volume1/screenpipe$","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (-zsh)","depth":2,"bounds":{"left":0.32912233,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33111703,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.3879654,"top":1.0,"width":0.058843084,"height":-0.042298436},"on_screen":true,"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3899601,"top":1.0,"width":0.005319149,"height":-0.04549086},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8009599440207839236
|
-5807833556681052111
|
click
|
accessibility
|
NULL
|
-rw-r--r-- 1 lukas staff 4620 11 May 11:44 -rw-r--r-- 1 lukas staff 4620 11 May 11:44 System Audio (output)_2026-05-11_08-44-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-44-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:45 System Audio (output)_2026-05-11_08-45-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:45 System Audio (output)_2026-05-11_08-45-31.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-45-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:46 System Audio (output)_2026-05-11_08-46-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:46 System Audio (output)_2026-05-11_08-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:47 System Audio (output)_2026-05-11_08-47-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:48 System Audio (output)_2026-05-11_08-47-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:48 System Audio (output)_2026-05-11_08-48-28.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:49 System Audio (output)_2026-05-11_08-49-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:49 System Audio (output)_2026-05-11_08-49-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-49-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:50 System Audio (output)_2026-05-11_08-50-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-50-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:51 System Audio (output)_2026-05-11_08-51-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-51-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:52 System Audio (output)_2026-05-11_08-52-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:52 System Audio (output)_2026-05-11_08-52-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:53 System Audio (output)_2026-05-11_08-52-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:53 System Audio (output)_2026-05-11_08-53-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-53-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:54 System Audio (output)_2026-05-11_08-54-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:54 System Audio (output)_2026-05-11_08-54-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-54-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:55 System Audio (output)_2026-05-11_08-55-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-55-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 11:56 System Audio (output)_2026-05-11_08-56-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:56 System Audio (output)_2026-05-11_08-56-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-56-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:57 System Audio (output)_2026-05-11_08-57-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-57-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:58 System Audio (output)_2026-05-11_08-58-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-58-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 11:59 System Audio (output)_2026-05-11_08-59-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_08-59-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:00 System Audio (output)_2026-05-11_09-00-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-00-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:01 System Audio (output)_2026-05-11_09-01-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:01 System Audio (output)_2026-05-11_09-01-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-01-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:02 System Audio (output)_2026-05-11_09-02-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:02 System Audio (output)_2026-05-11_09-02-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-02-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:03 System Audio (output)_2026-05-11_09-03-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:03 System Audio (output)_2026-05-11_09-03-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-03-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:04 System Audio (output)_2026-05-11_09-04-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-04-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:05 System Audio (output)_2026-05-11_09-05-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:05 System Audio (output)_2026-05-11_09-05-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-05-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:06 System Audio (output)_2026-05-11_09-06-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:07 System Audio (output)_2026-05-11_09-06-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:07 System Audio (output)_2026-05-11_09-07-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-07-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:08 System Audio (output)_2026-05-11_09-08-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:08 System Audio (output)_2026-05-11_09-08-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-08-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:09 System Audio (output)_2026-05-11_09-09-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:09 System Audio (output)_2026-05-11_09-09-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-09-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:10 System Audio (output)_2026-05-11_09-10-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-10-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:11 System Audio (output)_2026-05-11_09-11-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:11 System Audio (output)_2026-05-11_09-11-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-11-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:12 System Audio (output)_2026-05-11_09-12-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:12 System Audio (output)_2026-05-11_09-12-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-12-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:13 System Audio (output)_2026-05-11_09-13-35.mp4
-rw-r--r-- 1 lukas staff 148642 11 May 12:14 System Audio (output)_2026-05-11_09-13-57.mp4
-rw-r--r-- 1 lukas staff 254941 11 May 12:14 System Audio (output)_2026-05-11_09-14-20.mp4
-rw-r--r-- 1 lukas staff 264310 11 May 12:15 System Audio (output)_2026-05-11_09-14-43.mp4
-rw-r--r-- 1 lukas staff 272393 11 May 12:15 System Audio (output)_2026-05-11_09-15-05.mp4
-rw-r--r-- 1 lukas staff 248013 11 May 12:15 System Audio (output)_2026-05-11_09-15-28.mp4
-rw-r--r-- 1 lukas staff 263009 11 May 12:16 System Audio (output)_2026-05-11_09-15-50.mp4
-rw-r--r-- 1 lukas staff 253208 11 May 12:16 System Audio (output)_2026-05-11_09-16-12.mp4
-rw-r--r-- 1 lukas staff 242122 11 May 12:16 System Audio (output)_2026-05-11_09-16-34.mp4
-rw-r--r-- 1 lukas staff 257156 11 May 12:17 System Audio (output)_2026-05-11_09-16-57.mp4
-rw-r--r-- 1 lukas staff 239210 11 May 12:17 System Audio (output)_2026-05-11_09-17-19.mp4
-rw-r--r-- 1 lukas staff 237653 11 May 12:18 System Audio (output)_2026-05-11_09-17-41.mp4
-rw-r--r-- 1 lukas staff 245101 11 May 12:18 System Audio (output)_2026-05-11_09-18-04.mp4
-rw-r--r-- 1 lukas staff 235393 11 May 12:18 System Audio (output)_2026-05-11_09-18-26.mp4
-rw-r--r-- 1 lukas staff 249343 11 May 12:19 System Audio (output)_2026-05-11_09-18-49.mp4
-rw-r--r-- 1 lukas staff 244654 11 May 12:19 System Audio (output)_2026-05-11_09-19-11.mp4
-rw-r--r-- 1 lukas staff 259224 11 May 12:19 System Audio (output)_2026-05-11_09-19-33.mp4
-rw-r--r-- 1 lukas staff 218222 11 May 12:20 System Audio (output)_2026-05-11_09-19-56.mp4
-rw-r--r-- 1 lukas staff 262035 11 May 12:20 System Audio (output)_2026-05-11_09-20-19.mp4
-rw-r--r-- 1 lukas staff 243667 11 May 12:21 System Audio (output)_2026-05-11_09-20-41.mp4
-rw-r--r-- 1 lukas staff 225529 11 May 12:21 System Audio (output)_2026-05-11_09-21-03.mp4
-rw-r--r-- 1 lukas staff 243406 11 May 12:21 System Audio (output)_2026-05-11_09-21-26.mp4
-rw-r--r-- 1 lukas staff 248837 11 May 12:22 System Audio (output)_2026-05-11_09-21-48.mp4
-rw-r--r-- 1 lukas staff 209642 11 May 12:22 System Audio (output)_2026-05-11_09-22-10.mp4
-rw-r--r-- 1 lukas staff 16741 11 May 12:22 System Audio (output)_2026-05-11_09-22-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:23 System Audio (output)_2026-05-11_09-22-55.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:23 System Audio (output)_2026-05-11_09-23-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:24 System Audio (output)_2026-05-11_09-23-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:24 System Audio (output)_2026-05-11_09-24-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:25 System Audio (output)_2026-05-11_09-24-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:25 System Audio (output)_2026-05-11_09-25-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-25-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:26 System Audio (output)_2026-05-11_09-26-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-26-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:27 System Audio (output)_2026-05-11_09-27-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:28 System Audio (output)_2026-05-11_09-27-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:28 System Audio (output)_2026-05-11_09-28-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:29 System Audio (output)_2026-05-11_09-28-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:29 System Audio (output)_2026-05-11_09-29-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:30 System Audio (output)_2026-05-11_09-29-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:30 System Audio (output)_2026-05-11_09-30-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-30-41.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:31 System Audio (output)_2026-05-11_09-31-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:31 System Audio (output)_2026-05-11_09-31-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-31-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:32 System Audio (output)_2026-05-11_09-32-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-32-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:33 System Audio (output)_2026-05-11_09-33-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:34 System Audio (output)_2026-05-11_09-33-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:34 System Audio (output)_2026-05-11_09-34-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-34-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:35 System Audio (output)_2026-05-11_09-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-35-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:36 System Audio (output)_2026-05-11_09-36-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:36 System Audio (output)_2026-05-11_09-36-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-36-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:37 System Audio (output)_2026-05-11_09-37-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-37-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:38 System Audio (output)_2026-05-11_09-38-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-38-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:39 System Audio (output)_2026-05-11_09-39-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:39 System Audio (output)_2026-05-11_09-39-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:40 System Audio (output)_2026-05-11_09-39-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:40 System Audio (output)_2026-05-11_09-40-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-40-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:41 System Audio (output)_2026-05-11_09-41-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:42 System Audio (output)_2026-05-11_09-41-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:42 System Audio (output)_2026-05-11_09-42-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-42-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:43 System Audio (output)_2026-05-11_09-43-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-43-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:44 System Audio (output)_2026-05-11_09-44-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:44 System Audio (output)_2026-05-11_09-44-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-44-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:45 System Audio (output)_2026-05-11_09-45-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:45 System Audio (output)_2026-05-11_09-45-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-45-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:46 System Audio (output)_2026-05-11_09-46-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-46-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:47 System Audio (output)_2026-05-11_09-47-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:48 System Audio (output)_2026-05-11_09-47-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:48 System Audio (output)_2026-05-11_09-48-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-48-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:49 System Audio (output)_2026-05-11_09-49-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:50 System Audio (output)_2026-05-11_09-49-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:50 System Audio (output)_2026-05-11_09-50-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-50-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:51 System Audio (output)_2026-05-11_09-51-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:51 System Audio (output)_2026-05-11_09-51-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:52 System Audio (output)_2026-05-11_09-51-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:52 System Audio (output)_2026-05-11_09-52-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-52-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:53 System Audio (output)_2026-05-11_09-53-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-53-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:54 System Audio (output)_2026-05-11_09-54-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:54 System Audio (output)_2026-05-11_09-54-24.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-54-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:55 System Audio (output)_2026-05-11_09-55-08.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:55 System Audio (output)_2026-05-11_09-55-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:56 System Audio (output)_2026-05-11_09-55-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:56 System Audio (output)_2026-05-11_09-56-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-56-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:57 System Audio (output)_2026-05-11_09-57-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-57-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:58 System Audio (output)_2026-05-11_09-58-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:58 System Audio (output)_2026-05-11_09-58-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-58-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 12:59 System Audio (output)_2026-05-11_09-59-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 12:59 System Audio (output)_2026-05-11_09-59-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:00 System Audio (output)_2026-05-11_09-59-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:00 System Audio (output)_2026-05-11_10-00-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-00-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:01 System Audio (output)_2026-05-11_10-01-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-01-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:02 System Audio (output)_2026-05-11_10-02-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:03 System Audio (output)_2026-05-11_10-02-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:03 System Audio (output)_2026-05-11_10-03-18.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:04 System Audio (output)_2026-05-11_10-03-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:04 System Audio (output)_2026-05-11_10-04-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:05 System Audio (output)_2026-05-11_10-04-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:05 System Audio (output)_2026-05-11_10-05-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:06 System Audio (output)_2026-05-11_10-05-54.mp4
-rw-r--r-- 1 lukas staff 12287 11 May 13:06 System Audio (output)_2026-05-11_10-06-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:07 System Audio (output)_2026-05-11_10-06-38.mp4
-rw-r--r-- 1 lukas staff 11822 11 May 13:07 System Audio (output)_2026-05-11_10-07-01.mp4
-rw-r--r-- 1 lukas staff 6601 11 May 13:07 System Audio (output)_2026-05-11_10-07-23.mp4
-rw-r--r-- 1 lukas staff 10156 11 May 13:08 System Audio (output)_2026-05-11_10-07-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:08 System Audio (output)_2026-05-11_10-08-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-08-52.mp4
-rw-r--r-- 1 lukas staff 11722 11 May 13:09 System Audio (output)_2026-05-11_10-09-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:09 System Audio (output)_2026-05-11_10-09-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-09-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:10 System Audio (output)_2026-05-11_10-10-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-10-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:11 System Audio (output)_2026-05-11_10-11-06.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:11 System Audio (output)_2026-05-11_10-11-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-11-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:12 System Audio (output)_2026-05-11_10-12-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:12 System Audio (output)_2026-05-11_10-12-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:13 System Audio (output)_2026-05-11_10-12-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:13 System Audio (output)_2026-05-11_10-13-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-13-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:14 System Audio (output)_2026-05-11_10-14-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-14-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:15 System Audio (output)_2026-05-11_10-15-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:15 System Audio (output)_2026-05-11_10-15-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:16 System Audio (output)_2026-05-11_10-15-54.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:16 System Audio (output)_2026-05-11_10-16-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-16-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:17 System Audio (output)_2026-05-11_10-17-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:17 System Audio (output)_2026-05-11_10-17-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-17-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:18 System Audio (output)_2026-05-11_10-18-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-18-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:19 System Audio (output)_2026-05-11_10-19-36.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:20 System Audio (output)_2026-05-11_10-19-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:20 System Audio (output)_2026-05-11_10-20-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:21 System Audio (output)_2026-05-11_10-20-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:21 System Audio (output)_2026-05-11_10-21-05.mp4
-rw-r--r-- 1 lukas staff 11467 11 May 13:21 System Audio (output)_2026-05-11_10-21-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-21-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:22 System Audio (output)_2026-05-11_10-22-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:23 System Audio (output)_2026-05-11_10-22-56.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:23 System Audio (output)_2026-05-11_10-23-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-23-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:24 System Audio (output)_2026-05-11_10-24-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:25 System Audio (output)_2026-05-11_10-24-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:25 System Audio (output)_2026-05-11_10-25-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-25-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:26 System Audio (output)_2026-05-11_10-26-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-26-39.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-01.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:27 System Audio (output)_2026-05-11_10-27-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:28 System Audio (output)_2026-05-11_10-27-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:28 System Audio (output)_2026-05-11_10-28-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-28-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:29 System Audio (output)_2026-05-11_10-29-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:29 System Audio (output)_2026-05-11_10-29-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-29-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:30 System Audio (output)_2026-05-11_10-30-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-30-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:31 System Audio (output)_2026-05-11_10-31-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-31-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:32 System Audio (output)_2026-05-11_10-32-35.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:33 System Audio (output)_2026-05-11_10-32-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:33 System Audio (output)_2026-05-11_10-33-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-33-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:34 System Audio (output)_2026-05-11_10-34-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:34 System Audio (output)_2026-05-11_10-34-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:35 System Audio (output)_2026-05-11_10-34-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:35 System Audio (output)_2026-05-11_10-35-33.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-35-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:36 System Audio (output)_2026-05-11_10-36-17.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-36-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:37 System Audio (output)_2026-05-11_10-37-24.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:38 System Audio (output)_2026-05-11_10-37-46.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:38 System Audio (output)_2026-05-11_10-38-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-38-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:39 System Audio (output)_2026-05-11_10-39-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:39 System Audio (output)_2026-05-11_10-39-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-39-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:40 System Audio (output)_2026-05-11_10-40-21.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-40-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:41 System Audio (output)_2026-05-11_10-41-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-41-50.mp4
-rw-r--r-- 1 lukas staff 11910 11 May 13:42 System Audio (output)_2026-05-11_10-42-13.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:42 System Audio (output)_2026-05-11_10-42-35.mp4
-rw-r--r-- 1 lukas staff 11037 11 May 13:43 System Audio (output)_2026-05-11_10-42-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:43 System Audio (output)_2026-05-11_10-43-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:44 System Audio (output)_2026-05-11_10-44-28.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:45 System Audio (output)_2026-05-11_10-44-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:45 System Audio (output)_2026-05-11_10-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:46 System Audio (output)_2026-05-11_10-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:46 System Audio (output)_2026-05-11_10-46-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:47 System Audio (output)_2026-05-11_10-47-04.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:47 System Audio (output)_2026-05-11_10-47-26.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:48 System Audio (output)_2026-05-11_10-47-48.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:48 System Audio (output)_2026-05-11_10-48-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-48-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:49 System Audio (output)_2026-05-11_10-49-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-49-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:50 System Audio (output)_2026-05-11_10-50-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-50-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:51 System Audio (output)_2026-05-11_10-51-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:51 System Audio (output)_2026-05-11_10-51-32.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:52 System Audio (output)_2026-05-11_10-51-54.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:52 System Audio (output)_2026-05-11_10-52-16.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:53 System Audio (output)_2026-05-11_10-52-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:53 System Audio (output)_2026-05-11_10-53-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-53-45.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:54 System Audio (output)_2026-05-11_10-54-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:54 System Audio (output)_2026-05-11_10-54-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-54-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:55 System Audio (output)_2026-05-11_10-55-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-55-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:56 System Audio (output)_2026-05-11_10-56-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-56-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:57 System Audio (output)_2026-05-11_10-57-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:58 System Audio (output)_2026-05-11_10-57-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:58 System Audio (output)_2026-05-11_10-58-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-58-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 13:59 System Audio (output)_2026-05-11_10-59-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 13:59 System Audio (output)_2026-05-11_10-59-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:00 System Audio (output)_2026-05-11_10-59-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-07.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:00 System Audio (output)_2026-05-11_11-00-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-00-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:01 System Audio (output)_2026-05-11_11-01-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:02 System Audio (output)_2026-05-11_11-01-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-01-59.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:02 System Audio (output)_2026-05-11_11-02-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:03 System Audio (output)_2026-05-11_11-02-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:03 System Audio (output)_2026-05-11_11-03-28.mp4
-rw-r--r-- 1 lukas staff 11583 11 May 14:04 System Audio (output)_2026-05-11_11-03-51.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-13.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:04 System Audio (output)_2026-05-11_11-04-36.mp4
-rw-r--r-- 1 lukas staff 11255 11 May 14:05 System Audio (output)_2026-05-11_11-04-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:05 System Audio (output)_2026-05-11_11-05-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:06 System Audio (output)_2026-05-11_11-05-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:06 System Audio (output)_2026-05-11_11-06-28.mp4
-rw-r--r-- 1 lukas staff 11403 11 May 14:07 System Audio (output)_2026-05-11_11-06-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:07 System Audio (output)_2026-05-11_11-07-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:07 System Audio (output)_2026-05-11_11-07-35.mp4
-rw-r--r-- 1 lukas staff 11766 11 May 14:08 System Audio (output)_2026-05-11_11-07-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:08 System Audio (output)_2026-05-11_11-08-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-08-41.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-03.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:09 System Audio (output)_2026-05-11_11-09-26.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-09-48.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:10 System Audio (output)_2026-05-11_11-10-11.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:10 System Audio (output)_2026-05-11_11-10-33.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:11 System Audio (output)_2026-05-11_11-10-55.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:11 System Audio (output)_2026-05-11_11-11-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:12 System Audio (output)_2026-05-11_11-11-40.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-02.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:12 System Audio (output)_2026-05-11_11-12-24.mp4
-rw-r--r-- 1 lukas staff 13156 11 May 14:13 System Audio (output)_2026-05-11_11-12-47.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:13 System Audio (output)_2026-05-11_11-13-10.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:13 System Audio (output)_2026-05-11_11-13-32.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:14 System Audio (output)_2026-05-11_11-13-54.mp4
-rw-r--r-- 1 lukas staff 11489 11 May 14:14 System Audio (output)_2026-05-11_11-14-17.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:15 System Audio (output)_2026-05-11_11-14-39.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-01.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:15 System Audio (output)_2026-05-11_11-15-24.mp4
-rw-r--r-- 1 lukas staff 11720 11 May 14:16 System Audio (output)_2026-05-11_11-15-46.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-09.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:16 System Audio (output)_2026-05-11_11-16-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-16-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:17 System Audio (output)_2026-05-11_11-17-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-17-38.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:18 System Audio (output)_2026-05-11_11-18-00.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:18 System Audio (output)_2026-05-11_11-18-23.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-18-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:19 System Audio (output)_2026-05-11_11-19-30.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-19-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:20 System Audio (output)_2026-05-11_11-20-15.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-37.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:21 System Audio (output)_2026-05-11_11-20-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:21 System Audio (output)_2026-05-11_11-21-22.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-21-44.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:22 System Audio (output)_2026-05-11_11-22-07.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:22 System Audio (output)_2026-05-11_11-22-29.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-22-52.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-14.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:23 System Audio (output)_2026-05-11_11-23-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:24 System Audio (output)_2026-05-11_11-23-58.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:24 System Audio (output)_2026-05-11_11-24-20.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-24-43.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-05.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:25 System Audio (output)_2026-05-11_11-25-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-25-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:26 System Audio (output)_2026-05-11_11-26-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:26 System Audio (output)_2026-05-11_11-26-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:27 System Audio (output)_2026-05-11_11-26-56.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:27 System Audio (output)_2026-05-11_11-27-18.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-27-40.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-02.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:28 System Audio (output)_2026-05-11_11-28-25.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-28-47.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-09.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:29 System Audio (output)_2026-05-11_11-29-31.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-29-53.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:30 System Audio (output)_2026-05-11_11-30-16.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-30-38.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:31 System Audio (output)_2026-05-11_11-31-00.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:31 System Audio (output)_2026-05-11_11-31-23.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:32 System Audio (output)_2026-05-11_11-31-45.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-08.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:32 System Audio (output)_2026-05-11_11-32-30.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:33 System Audio (output)_2026-05-11_11-32-52.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:33 System Audio (output)_2026-05-11_11-33-15.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-37.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-33-59.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:34 System Audio (output)_2026-05-11_11-34-22.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:35 System Audio (output)_2026-05-11_11-34-44.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-06.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:35 System Audio (output)_2026-05-11_11-35-29.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-35-51.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-14.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:36 System Audio (output)_2026-05-11_11-36-36.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-36-58.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:37 System Audio (output)_2026-05-11_11-37-21.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:38 System Audio (output)_2026-05-11_11-37-43.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:38 System Audio (output)_2026-05-11_11-38-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:39 System Audio (output)_2026-05-11_11-38-50.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:39 System Audio (output)_2026-05-11_11-39-12.mp4
-rw-r--r-- 1 lukas staff 8643 11 May 14:39 System Audio (output)_2026-05-11_11-39-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:40 System Audio (output)_2026-05-11_11-39-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:40 System Audio (output)_2026-05-11_11-40-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-40-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:41 System Audio (output)_2026-05-11_11-41-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:42 System Audio (output)_2026-05-11_11-41-49.mp4
-rw-r--r-- 1 lukas staff 9362 11 May 14:42 System Audio (output)_2026-05-11_11-42-11.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:42 System Audio (output)_2026-05-11_11-42-34.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-42-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:43 System Audio (output)_2026-05-11_11-43-19.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:44 System Audio (output)_2026-05-11_11-43-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:44 System Audio (output)_2026-05-11_11-44-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-44-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:45 System Audio (output)_2026-05-11_11-45-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:46 System Audio (output)_2026-05-11_11-45-57.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:46 System Audio (output)_2026-05-11_11-46-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-46-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:47 System Audio (output)_2026-05-11_11-47-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-47-50.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:48 System Audio (output)_2026-05-11_11-48-12.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:48 System Audio (output)_2026-05-11_11-48-35.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-48-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:49 System Audio (output)_2026-05-11_11-49-20.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-49-42.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-04.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:50 System Audio (output)_2026-05-11_11-50-27.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-50-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:51 System Audio (output)_2026-05-11_11-51-12.mp4
-rw-r--r-- 1 lukas staff 8013 11 May 14:51 System Audio (output)_2026-05-11_11-51-34.mp4
-rw-r--r-- 1 lukas staff 7286 11 May 14:52 System Audio (output)_2026-05-11_11-51-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:52 System Audio (output)_2026-05-11_11-52-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-52-42.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:53 System Audio (output)_2026-05-11_11-53-05.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:53 System Audio (output)_2026-05-11_11-53-27.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:54 System Audio (output)_2026-05-11_11-53-49.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-12.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:54 System Audio (output)_2026-05-11_11-54-34.mp4
-rw-r--r-- 1 lukas staff 4628 11 May 14:55 System Audio (output)_2026-05-11_11-54-57.mp4
-rw-r--r-- 1 lukas staff 4620 11 May 14:55 System Audio (output)_2026-05-11_11-55-19.mp4
-rw-r--r-- 1 lukas staff 4620 11 May ...
|
26388
|
NULL
|
NULL
|
NULL
|
|
4689
|
170
|
19
|
2026-05-07T14:21:36.827265+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778163696827_m2.jpg...
|
PhpStorm
|
faVsco.js – custom.log
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {"headers":{"Date":["Thu, 07 May 2026 14:21:15 GMT"],"Content-Type":["application/json;charset=utf-8"],"Transfer-Encoding":["chunked"],"Connection":["keep-alive"],"CF-Ray":["9f80deb8db60dc3a-SOF"],"CF-Cache-Status":["DYNAMIC"],"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],"Vary":["origin, accept-encoding"],"access-control-allow-credentials":["false"],"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\", cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],"x-content-type-options":["nosniff"],"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu, 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],"Report-To":["{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],\"group\":\"cf-nel\",\"max_age\":604800}"],"NEL":["{\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}"],"Server":["cloudflare"]}} {"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab","trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Code changed:
Hide
Sync Changes
Hide This Notification
5
120
5
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Console\Commands;
use Carbon\Carbon;
use Carbon\CarbonImmutable;
use Illuminate\Console\Command;
use InvalidArgumentException;
use Jiminny\Jobs\AutomatedReports\RequestGenerateAskJiminnyReportJob;
use Jiminny\Jobs\AutomatedReports\SendReportMailJob;
use Jiminny\Jobs\JobDispatcherInterface;
use Jiminny\Models\Activity;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\AutomatedReportsRepository;
use Jiminny\Services\Activity\CrmOwnerResolver;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\UserPilot\UserPilotClient;
/**
* Class JiminnyDebugCommand
*
* @package Jiminny\Console\Commands
*/
class JiminnyDebugCommand extends Command
{
public const string FREQUENCY_DAILY = 'daily';
public const string FREQUENCY_WEEKLY = 'weekly';
public const string FREQUENCY_MONTHLY = 'monthly';
public const string FREQUENCY_QUARTERLY = 'quarterly';
public const string FREQUENCY_ONE_OFF = 'one_off';
protected $signature = 'jiminny:debug';
public function handle(
JobDispatcherInterface $jobDispatcher,
AutomatedReportsService $automatedReportsService,
AutomatedReportsRepository $automatedReportsRepository,
UserPilotClient $userPilotClient
): void {
$this->rateLimit();
exit(1);
$report = AutomatedReport::find(71);
$last = AutomatedReportResult::query()
->where('report_id', $report->getId())
->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])
// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)
->whereDate('created_at', CarbonImmutable::now()->toDateString())
->latest()
->first();
$this->info("Last: {$last->getId()}");
exit(1);
$user = User::find(143);
// $count = $automatedReportsRepository->countUserReports($user);
// $this->info("Count: {$count}");
// $count = $automatedReportsRepository->countAllUserReports($user);
// $this->info("All count: {$count}");
$payload = [
'report_type' => 'ask_jiminny',
'frequency' => 'weekly',
];
$userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);
exit(1);
$now = Carbon::now()->subDay(1);
$this->info("Now: {$now->toDateTimeString()}");
$weekStart = Carbon::getWeekStartsAt();
$this->info("Now: {$weekStart}");
// $from = $now->copy()->previousWeekday()->startOfDay();
// $to = $now->copy()->previousWeekday()->endOfDay();
// $fromOld = $now->copy()->subWeeks(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subWeek()->startOfWeek();
// $toNew = $now->copy()->subWeek()->endOfWeek();
// $fromOld = $now->copy()->subMonths(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();
// $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();
$fromOld = $now->copy()->subMonths(3)->startOfDay();
$toOld = $now->copy()->subDay()->endOfDay();
$fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();
$toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();
$this->info("From old: {$fromOld->toDateTimeString()}");
$this->info("To old: {$toOld->toDateTimeString()}");
$this->info("From new: {$fromNew->toDateTimeString()}");
$this->info("To new: {$toNew->toDateTimeString()}");
exit(1);
$report = AutomatedReport::find(71);
$job = new RequestGenerateAskJiminnyReportJob($report->getUuid());
$jobDispatcher->dispatch($job);
exit(1);
// $this->formatDate($jobDispatcher);
// $this->sendMail($jobDispatcher, $automatedReportsService);
// $this->crmService();
$this->getPayload($automatedReportsService);
exit(1);
}
private function crmService()
{
$activity = Activity::find(418141);
$team = Team::find(19);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
$crmService->createTranscriptNotes($activity);
}
private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)
{
$reportUuid = '';
// $report = $automatedReportsService->getReportResult($reportUuid);
$report = AutomatedReportResult::find(275);
$validRecipients = $automatedReportsService->getValidRecipientUsers(
$report->getReport(),
includeJiminny: true,
);
$recipient = $validRecipients[0];
$fileName = $automatedReportsService->getReportFileName($report);
$typeName = $report->getReport()->getCustomName()
?? $automatedReportsService->getReportTypeName($report);
$teamsName = $automatedReportsService->getReportTeamsName($report);
$periodName = $automatedReportsService->getReportPeriodName($report);
$s3Path = $automatedReportsService->getMediaPath($report);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));
$jobDispatcher->dispatch(
new SendReportMailJob(
reportUuid: $report->getUuid(),
s3Path: $s3Path,
recipientEmail: $recipient['email'],
recipientName: $recipient['name'] ?? null,
fileName: $fileName,
typeName: $typeName,
teamsName: $teamsName,
periodName: $periodName,
isAskJiminny: true,
)
);
exit(1);
}
private function formatDate(JobDispatcherInterface $jobDispatcher): void
{
$customName = 'Custom report name';
// $frequency = self::FREQUENCY_DAILY;
// $frequency = self::FREQUENCY_WEEKLY;
$frequency = self::FREQUENCY_MONTHLY;
// $frequency = self::FREQUENCY_QUARTERLY;
// $frequency = self::FREQUENCY_ONE_OFF;
$period = $this->calculateFromAndToDatePeriod($frequency);
$from = $period['fromDate'];
$to = $period['toDate'];
$periodName = $this->formatReportPeriodName($frequency, $from, $to);
$filenameSuffix = null;
if ($customName) {
if ($filenameSuffix) {
$customName .= " {$filenameSuffix}";
}
$result = $this->sanitizeFileName("{$customName} - {$periodName}");
}
$this->info($result);
}
public function calculateFromAndToDatePeriod(
string $frequency,
?Carbon $fromDate = null,
?Carbon $toDate = null
): array {
if ($frequency === self::FREQUENCY_ONE_OFF) {
return [
'fromDate' => $fromDate,
'toDate' => $toDate,
];
}
$now = Carbon::now();
return match ($frequency) {
self::FREQUENCY_DAILY => [
'fromDate' => $now->copy()->subDay()->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_WEEKLY => [
'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_MONTHLY => [
'fromDate' => $now->copy()->subMonths(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_QUARTERLY => [
'fromDate' => $now->copy()->subMonths(3)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
default => throw new InvalidArgumentException("Unsupported frequency: {$frequency}"),
};
}
private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string
{
$fromYear = $from->format('Y');
$toYear = $to->format('Y');
$differentYears = $fromYear !== $toYear;
switch ($frequency) {
case self::FREQUENCY_DAILY:
return $from->format('j M Y');
case self::FREQUENCY_QUARTERLY:
// 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ
$startMonth = $from->format('M');
$endMonth = $to->copy()->subMonth();
$endMonthName = $endMonth->format('M');
$endMonthYear = $endMonth->format('Y');
if ($differentYears) {
return "{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}";
}
return "{$startMonth} - {$endMonthName} {$toYear}";
case self::FREQUENCY_MONTHLY:
// 'May 2025' - monthly reports are always within the same year
return $from->format('M Y');
case self::FREQUENCY_WEEKLY:
// '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ
$startDay = $from->format('j');
$endDay = $to->format('j');
$startMonth = $from->format('M');
$endMonth = $to->format('M');
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
if ($startMonth !== $endMonth) {
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
}
return "{$startDay} - {$endDay} {$endMonth} {$toYear}";
case self::FREQUENCY_ONE_OFF:
// '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ
$startDay = $from->format('j');
$startMonth = $from->format('M');
$endDay = $to->format('j');
$endMonth = $to->format('M');
// If same month and year, use a format like '2-31 May 2025'
if ($startMonth === $endMonth && ! $differentYears) {
return "{$startDay} - {$endDay} {$startMonth} {$toYear}";
}
// If different years, include both years
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
// Same year but different months
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
default:
// Default format for unknown frequencies
return $from->format('j M Y') . ' - ' . $to->format('j M Y');
}
}
public function sanitizeFileName(string $fileName): string
{
return str_replace(['/', '\\'], '-', $fileName);
}
private function getPayload(AutomatedReportsService $automatedReportsService)
{
$reportResult = AutomatedReportResult::find(269);
$automatedReport = $reportResult->getReport();
$activityIds = [1,2,3];
$payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(
automatedReport: $automatedReport,
reportResult: $reportResult,
activityIds: $activityIds,
);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));
}
private function rateLimit()
{
$team = Team::find(2);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
for ($i = 0 ; $i < 3; $i++) {
// if ($i % 25 === 0) {
// $this->info("Syncing opportunity {$i}");
$this->info("Matching contact {$i}");
// }
// $crmService->syncOpportunity('374720564');
$crmService->matchByName('Robot');
}
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"master, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.040226065,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.96276593,"top":0.07581804,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9740692,"top":0.074221864,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.98138297,"top":0.074221864,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\"headers\":{\"Date\":[\"Thu, 07 May 2026 14:21:15 GMT\"],\"Content-Type\":[\"application/json;charset=utf-8\"],\"Transfer-Encoding\":[\"chunked\"],\"Connection\":[\"keep-alive\"],\"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\"CF-Cache-Status\":[\"DYNAMIC\"],\"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\"Vary\":[\"origin, accept-encoding\"],\"access-control-allow-credentials\":[\"false\"],\"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\", cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\"x-content-type-options\":[\"nosniff\"],\"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu, 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\"Report-To\":[\"{\\\"endpoints\\\":[{\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\\\"group\\\":\\\"cf-nel\\\",\\\"max_age\\\":604800}\"],\"NEL\":[\"{\\\"success_fraction\\\":0.01,\\\"report_to\\\":\\\"cf-nel\\\",\\\"max_age\\\":604800}\"],\"Server\":[\"cloudflare\"]}} {\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"bounds":{"left":0.5475399,"top":0.0726257,"width":0.4524601,"height":0.9066241},"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\"headers\":{\"Date\":[\"Thu, 07 May 2026 14:21:15 GMT\"],\"Content-Type\":[\"application/json;charset=utf-8\"],\"Transfer-Encoding\":[\"chunked\"],\"Connection\":[\"keep-alive\"],\"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\"CF-Cache-Status\":[\"DYNAMIC\"],\"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\"Vary\":[\"origin, accept-encoding\"],\"access-control-allow-credentials\":[\"false\"],\"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\", cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\"x-content-type-options\":[\"nosniff\"],\"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu, 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\"Report-To\":[\"{\\\"endpoints\\\":[{\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\\\"group\\\":\\\"cf-nel\\\",\\\"max_age\\\":604800}\"],\"NEL\":[\"{\\\"success_fraction\\\":0.01,\\\"report_to\\\":\\\"cf-nel\\\",\\\"max_age\\\":604800}\"],\"Server\":[\"cloudflare\"]}} {\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"5","depth":4,"bounds":{"left":0.48038563,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"120","depth":4,"bounds":{"left":0.49035904,"top":0.17478053,"width":0.011968086,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"bounds":{"left":0.5043218,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.51396275,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5212766,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Console\\Commands;\n\nuse Carbon\\Carbon;\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Console\\Command;\nuse InvalidArgumentException;\nuse Jiminny\\Jobs\\AutomatedReports\\RequestGenerateAskJiminnyReportJob;\nuse Jiminny\\Jobs\\AutomatedReports\\SendReportMailJob;\nuse Jiminny\\Jobs\\JobDispatcherInterface;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\AutomatedReportsRepository;\nuse Jiminny\\Services\\Activity\\CrmOwnerResolver;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\UserPilot\\UserPilotClient;\n\n/**\n * Class JiminnyDebugCommand\n *\n * @package Jiminny\\Console\\Commands\n */\nclass JiminnyDebugCommand extends Command\n{\n public const string FREQUENCY_DAILY = 'daily';\n public const string FREQUENCY_WEEKLY = 'weekly';\n public const string FREQUENCY_MONTHLY = 'monthly';\n public const string FREQUENCY_QUARTERLY = 'quarterly';\n public const string FREQUENCY_ONE_OFF = 'one_off';\n protected $signature = 'jiminny:debug';\n\n public function handle(\n JobDispatcherInterface $jobDispatcher,\n AutomatedReportsService $automatedReportsService,\n AutomatedReportsRepository $automatedReportsRepository,\n UserPilotClient $userPilotClient\n ): void {\n $this->rateLimit();\n exit(1);\n\n\n\n $report = AutomatedReport::find(71);\n $last = AutomatedReportResult::query()\n ->where('report_id', $report->getId())\n ->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])\n// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)\n ->whereDate('created_at', CarbonImmutable::now()->toDateString())\n ->latest()\n ->first();\n\n $this->info(\"Last: {$last->getId()}\");\n\n exit(1);\n\n $user = User::find(143);\n // $count = $automatedReportsRepository->countUserReports($user);\n // $this->info(\"Count: {$count}\");\n // $count = $automatedReportsRepository->countAllUserReports($user);\n // $this->info(\"All count: {$count}\");\n\n $payload = [\n 'report_type' => 'ask_jiminny',\n 'frequency' => 'weekly',\n ];\n $userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);\n\n exit(1);\n\n $now = Carbon::now()->subDay(1);\n $this->info(\"Now: {$now->toDateTimeString()}\");\n $weekStart = Carbon::getWeekStartsAt();\n $this->info(\"Now: {$weekStart}\");\n\n // $from = $now->copy()->previousWeekday()->startOfDay();\n // $to = $now->copy()->previousWeekday()->endOfDay();\n\n // $fromOld = $now->copy()->subWeeks(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subWeek()->startOfWeek();\n // $toNew = $now->copy()->subWeek()->endOfWeek();\n\n // $fromOld = $now->copy()->subMonths(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();\n // $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();\n\n $fromOld = $now->copy()->subMonths(3)->startOfDay();\n $toOld = $now->copy()->subDay()->endOfDay();\n $fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();\n $toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();\n\n $this->info(\"From old: {$fromOld->toDateTimeString()}\");\n $this->info(\"To old: {$toOld->toDateTimeString()}\");\n $this->info(\"From new: {$fromNew->toDateTimeString()}\");\n $this->info(\"To new: {$toNew->toDateTimeString()}\");\n\n exit(1);\n\n $report = AutomatedReport::find(71);\n\n $job = new RequestGenerateAskJiminnyReportJob($report->getUuid());\n $jobDispatcher->dispatch($job);\n\n exit(1);\n\n\n // $this->formatDate($jobDispatcher);\n // $this->sendMail($jobDispatcher, $automatedReportsService);\n // $this->crmService();\n\n $this->getPayload($automatedReportsService);\n\n exit(1);\n }\n\n\n\n private function crmService()\n {\n $activity = Activity::find(418141);\n\n $team = Team::find(19);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n $crmService->createTranscriptNotes($activity);\n }\n\n private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)\n {\n $reportUuid = '';\n // $report = $automatedReportsService->getReportResult($reportUuid);\n $report = AutomatedReportResult::find(275);\n $validRecipients = $automatedReportsService->getValidRecipientUsers(\n $report->getReport(),\n includeJiminny: true,\n );\n\n $recipient = $validRecipients[0];\n\n $fileName = $automatedReportsService->getReportFileName($report);\n $typeName = $report->getReport()->getCustomName()\n ?? $automatedReportsService->getReportTypeName($report);\n $teamsName = $automatedReportsService->getReportTeamsName($report);\n $periodName = $automatedReportsService->getReportPeriodName($report);\n $s3Path = $automatedReportsService->getMediaPath($report);\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));\n\n $jobDispatcher->dispatch(\n new SendReportMailJob(\n reportUuid: $report->getUuid(),\n s3Path: $s3Path,\n recipientEmail: $recipient['email'],\n recipientName: $recipient['name'] ?? null,\n fileName: $fileName,\n typeName: $typeName,\n teamsName: $teamsName,\n periodName: $periodName,\n isAskJiminny: true,\n )\n );\n\n exit(1);\n }\n\n private function formatDate(JobDispatcherInterface $jobDispatcher): void\n {\n $customName = 'Custom report name';\n // $frequency = self::FREQUENCY_DAILY;\n // $frequency = self::FREQUENCY_WEEKLY;\n $frequency = self::FREQUENCY_MONTHLY;\n // $frequency = self::FREQUENCY_QUARTERLY;\n // $frequency = self::FREQUENCY_ONE_OFF;\n $period = $this->calculateFromAndToDatePeriod($frequency);\n $from = $period['fromDate'];\n $to = $period['toDate'];\n $periodName = $this->formatReportPeriodName($frequency, $from, $to);\n $filenameSuffix = null;\n\n if ($customName) {\n if ($filenameSuffix) {\n $customName .= \" {$filenameSuffix}\";\n }\n\n $result = $this->sanitizeFileName(\"{$customName} - {$periodName}\");\n }\n\n $this->info($result);\n }\n\n public function calculateFromAndToDatePeriod(\n string $frequency,\n ?Carbon $fromDate = null,\n ?Carbon $toDate = null\n ): array {\n if ($frequency === self::FREQUENCY_ONE_OFF) {\n return [\n 'fromDate' => $fromDate,\n 'toDate' => $toDate,\n ];\n }\n\n $now = Carbon::now();\n\n return match ($frequency) {\n self::FREQUENCY_DAILY => [\n 'fromDate' => $now->copy()->subDay()->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_WEEKLY => [\n 'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_MONTHLY => [\n 'fromDate' => $now->copy()->subMonths(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_QUARTERLY => [\n 'fromDate' => $now->copy()->subMonths(3)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n default => throw new InvalidArgumentException(\"Unsupported frequency: {$frequency}\"),\n };\n }\n\n private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string\n {\n $fromYear = $from->format('Y');\n $toYear = $to->format('Y');\n $differentYears = $fromYear !== $toYear;\n\n switch ($frequency) {\n case self::FREQUENCY_DAILY:\n return $from->format('j M Y');\n\n case self::FREQUENCY_QUARTERLY:\n // 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ\n $startMonth = $from->format('M');\n $endMonth = $to->copy()->subMonth();\n $endMonthName = $endMonth->format('M');\n $endMonthYear = $endMonth->format('Y');\n\n if ($differentYears) {\n return \"{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}\";\n }\n\n return \"{$startMonth} - {$endMonthName} {$toYear}\";\n\n case self::FREQUENCY_MONTHLY:\n // 'May 2025' - monthly reports are always within the same year\n return $from->format('M Y');\n\n case self::FREQUENCY_WEEKLY:\n // '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ\n $startDay = $from->format('j');\n $endDay = $to->format('j');\n $startMonth = $from->format('M');\n $endMonth = $to->format('M');\n\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n if ($startMonth !== $endMonth) {\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n return \"{$startDay} - {$endDay} {$endMonth} {$toYear}\";\n\n case self::FREQUENCY_ONE_OFF:\n // '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ\n $startDay = $from->format('j');\n $startMonth = $from->format('M');\n $endDay = $to->format('j');\n $endMonth = $to->format('M');\n\n // If same month and year, use a format like '2-31 May 2025'\n if ($startMonth === $endMonth && ! $differentYears) {\n return \"{$startDay} - {$endDay} {$startMonth} {$toYear}\";\n }\n\n // If different years, include both years\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n // Same year but different months\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n\n default:\n // Default format for unknown frequencies\n return $from->format('j M Y') . ' - ' . $to->format('j M Y');\n }\n }\n\n public function sanitizeFileName(string $fileName): string\n {\n return str_replace(['/', '\\\\'], '-', $fileName);\n }\n\n private function getPayload(AutomatedReportsService $automatedReportsService)\n {\n $reportResult = AutomatedReportResult::find(269);\n $automatedReport = $reportResult->getReport();\n $activityIds = [1,2,3];\n $payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(\n automatedReport: $automatedReport,\n reportResult: $reportResult,\n activityIds: $activityIds,\n );\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));\n }\n\n private function rateLimit()\n {\n $team = Team::find(2);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n for ($i = 0 ; $i < 3; $i++) {\n// if ($i % 25 === 0) {\n// $this->info(\"Syncing opportunity {$i}\");\n $this->info(\"Matching contact {$i}\");\n// }\n// $crmService->syncOpportunity('374720564');\n $crmService->matchByName('Robot');\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Console\\Commands;\n\nuse Carbon\\Carbon;\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Console\\Command;\nuse InvalidArgumentException;\nuse Jiminny\\Jobs\\AutomatedReports\\RequestGenerateAskJiminnyReportJob;\nuse Jiminny\\Jobs\\AutomatedReports\\SendReportMailJob;\nuse Jiminny\\Jobs\\JobDispatcherInterface;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\AutomatedReportsRepository;\nuse Jiminny\\Services\\Activity\\CrmOwnerResolver;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\UserPilot\\UserPilotClient;\n\n/**\n * Class JiminnyDebugCommand\n *\n * @package Jiminny\\Console\\Commands\n */\nclass JiminnyDebugCommand extends Command\n{\n public const string FREQUENCY_DAILY = 'daily';\n public const string FREQUENCY_WEEKLY = 'weekly';\n public const string FREQUENCY_MONTHLY = 'monthly';\n public const string FREQUENCY_QUARTERLY = 'quarterly';\n public const string FREQUENCY_ONE_OFF = 'one_off';\n protected $signature = 'jiminny:debug';\n\n public function handle(\n JobDispatcherInterface $jobDispatcher,\n AutomatedReportsService $automatedReportsService,\n AutomatedReportsRepository $automatedReportsRepository,\n UserPilotClient $userPilotClient\n ): void {\n $this->rateLimit();\n exit(1);\n\n\n\n $report = AutomatedReport::find(71);\n $last = AutomatedReportResult::query()\n ->where('report_id', $report->getId())\n ->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])\n// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)\n ->whereDate('created_at', CarbonImmutable::now()->toDateString())\n ->latest()\n ->first();\n\n $this->info(\"Last: {$last->getId()}\");\n\n exit(1);\n\n $user = User::find(143);\n // $count = $automatedReportsRepository->countUserReports($user);\n // $this->info(\"Count: {$count}\");\n // $count = $automatedReportsRepository->countAllUserReports($user);\n // $this->info(\"All count: {$count}\");\n\n $payload = [\n 'report_type' => 'ask_jiminny',\n 'frequency' => 'weekly',\n ];\n $userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);\n\n exit(1);\n\n $now = Carbon::now()->subDay(1);\n $this->info(\"Now: {$now->toDateTimeString()}\");\n $weekStart = Carbon::getWeekStartsAt();\n $this->info(\"Now: {$weekStart}\");\n\n // $from = $now->copy()->previousWeekday()->startOfDay();\n // $to = $now->copy()->previousWeekday()->endOfDay();\n\n // $fromOld = $now->copy()->subWeeks(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subWeek()->startOfWeek();\n // $toNew = $now->copy()->subWeek()->endOfWeek();\n\n // $fromOld = $now->copy()->subMonths(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();\n // $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();\n\n $fromOld = $now->copy()->subMonths(3)->startOfDay();\n $toOld = $now->copy()->subDay()->endOfDay();\n $fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();\n $toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();\n\n $this->info(\"From old: {$fromOld->toDateTimeString()}\");\n $this->info(\"To old: {$toOld->toDateTimeString()}\");\n $this->info(\"From new: {$fromNew->toDateTimeString()}\");\n $this->info(\"To new: {$toNew->toDateTimeString()}\");\n\n exit(1);\n\n $report = AutomatedReport::find(71);\n\n $job = new RequestGenerateAskJiminnyReportJob($report->getUuid());\n $jobDispatcher->dispatch($job);\n\n exit(1);\n\n\n // $this->formatDate($jobDispatcher);\n // $this->sendMail($jobDispatcher, $automatedReportsService);\n // $this->crmService();\n\n $this->getPayload($automatedReportsService);\n\n exit(1);\n }\n\n\n\n private function crmService()\n {\n $activity = Activity::find(418141);\n\n $team = Team::find(19);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n $crmService->createTranscriptNotes($activity);\n }\n\n private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)\n {\n $reportUuid = '';\n // $report = $automatedReportsService->getReportResult($reportUuid);\n $report = AutomatedReportResult::find(275);\n $validRecipients = $automatedReportsService->getValidRecipientUsers(\n $report->getReport(),\n includeJiminny: true,\n );\n\n $recipient = $validRecipients[0];\n\n $fileName = $automatedReportsService->getReportFileName($report);\n $typeName = $report->getReport()->getCustomName()\n ?? $automatedReportsService->getReportTypeName($report);\n $teamsName = $automatedReportsService->getReportTeamsName($report);\n $periodName = $automatedReportsService->getReportPeriodName($report);\n $s3Path = $automatedReportsService->getMediaPath($report);\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));\n\n $jobDispatcher->dispatch(\n new SendReportMailJob(\n reportUuid: $report->getUuid(),\n s3Path: $s3Path,\n recipientEmail: $recipient['email'],\n recipientName: $recipient['name'] ?? null,\n fileName: $fileName,\n typeName: $typeName,\n teamsName: $teamsName,\n periodName: $periodName,\n isAskJiminny: true,\n )\n );\n\n exit(1);\n }\n\n private function formatDate(JobDispatcherInterface $jobDispatcher): void\n {\n $customName = 'Custom report name';\n // $frequency = self::FREQUENCY_DAILY;\n // $frequency = self::FREQUENCY_WEEKLY;\n $frequency = self::FREQUENCY_MONTHLY;\n // $frequency = self::FREQUENCY_QUARTERLY;\n // $frequency = self::FREQUENCY_ONE_OFF;\n $period = $this->calculateFromAndToDatePeriod($frequency);\n $from = $period['fromDate'];\n $to = $period['toDate'];\n $periodName = $this->formatReportPeriodName($frequency, $from, $to);\n $filenameSuffix = null;\n\n if ($customName) {\n if ($filenameSuffix) {\n $customName .= \" {$filenameSuffix}\";\n }\n\n $result = $this->sanitizeFileName(\"{$customName} - {$periodName}\");\n }\n\n $this->info($result);\n }\n\n public function calculateFromAndToDatePeriod(\n string $frequency,\n ?Carbon $fromDate = null,\n ?Carbon $toDate = null\n ): array {\n if ($frequency === self::FREQUENCY_ONE_OFF) {\n return [\n 'fromDate' => $fromDate,\n 'toDate' => $toDate,\n ];\n }\n\n $now = Carbon::now();\n\n return match ($frequency) {\n self::FREQUENCY_DAILY => [\n 'fromDate' => $now->copy()->subDay()->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_WEEKLY => [\n 'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_MONTHLY => [\n 'fromDate' => $now->copy()->subMonths(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_QUARTERLY => [\n 'fromDate' => $now->copy()->subMonths(3)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n default => throw new InvalidArgumentException(\"Unsupported frequency: {$frequency}\"),\n };\n }\n\n private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string\n {\n $fromYear = $from->format('Y');\n $toYear = $to->format('Y');\n $differentYears = $fromYear !== $toYear;\n\n switch ($frequency) {\n case self::FREQUENCY_DAILY:\n return $from->format('j M Y');\n\n case self::FREQUENCY_QUARTERLY:\n // 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ\n $startMonth = $from->format('M');\n $endMonth = $to->copy()->subMonth();\n $endMonthName = $endMonth->format('M');\n $endMonthYear = $endMonth->format('Y');\n\n if ($differentYears) {\n return \"{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}\";\n }\n\n return \"{$startMonth} - {$endMonthName} {$toYear}\";\n\n case self::FREQUENCY_MONTHLY:\n // 'May 2025' - monthly reports are always within the same year\n return $from->format('M Y');\n\n case self::FREQUENCY_WEEKLY:\n // '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ\n $startDay = $from->format('j');\n $endDay = $to->format('j');\n $startMonth = $from->format('M');\n $endMonth = $to->format('M');\n\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n if ($startMonth !== $endMonth) {\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n return \"{$startDay} - {$endDay} {$endMonth} {$toYear}\";\n\n case self::FREQUENCY_ONE_OFF:\n // '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ\n $startDay = $from->format('j');\n $startMonth = $from->format('M');\n $endDay = $to->format('j');\n $endMonth = $to->format('M');\n\n // If same month and year, use a format like '2-31 May 2025'\n if ($startMonth === $endMonth && ! $differentYears) {\n return \"{$startDay} - {$endDay} {$startMonth} {$toYear}\";\n }\n\n // If different years, include both years\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n // Same year but different months\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n\n default:\n // Default format for unknown frequencies\n return $from->format('j M Y') . ' - ' . $to->format('j M Y');\n }\n }\n\n public function sanitizeFileName(string $fileName): string\n {\n return str_replace(['/', '\\\\'], '-', $fileName);\n }\n\n private function getPayload(AutomatedReportsService $automatedReportsService)\n {\n $reportResult = AutomatedReportResult::find(269);\n $automatedReport = $reportResult->getReport();\n $activityIds = [1,2,3];\n $payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(\n automatedReport: $automatedReport,\n reportResult: $reportResult,\n activityIds: $activityIds,\n );\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));\n }\n\n private function rateLimit()\n {\n $team = Team::find(2);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n for ($i = 0 ; $i < 3; $i++) {\n// if ($i % 25 === 0) {\n// $this->info(\"Syncing opportunity {$i}\");\n $this->info(\"Matching contact {$i}\");\n// }\n// $crmService->syncOpportunity('374720564');\n $crmService->matchByName('Robot');\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8009244190567151207
|
3612303221736435083
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {"headers":{"Date":["Thu, 07 May 2026 14:21:15 GMT"],"Content-Type":["application/json;charset=utf-8"],"Transfer-Encoding":["chunked"],"Connection":["keep-alive"],"CF-Ray":["9f80deb8db60dc3a-SOF"],"CF-Cache-Status":["DYNAMIC"],"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],"Vary":["origin, accept-encoding"],"access-control-allow-credentials":["false"],"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\", cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],"x-content-type-options":["nosniff"],"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu, 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],"Report-To":["{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],\"group\":\"cf-nel\",\"max_age\":604800}"],"NEL":["{\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}"],"Server":["cloudflare"]}} {"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab","trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Code changed:
Hide
Sync Changes
Hide This Notification
5
120
5
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Console\Commands;
use Carbon\Carbon;
use Carbon\CarbonImmutable;
use Illuminate\Console\Command;
use InvalidArgumentException;
use Jiminny\Jobs\AutomatedReports\RequestGenerateAskJiminnyReportJob;
use Jiminny\Jobs\AutomatedReports\SendReportMailJob;
use Jiminny\Jobs\JobDispatcherInterface;
use Jiminny\Models\Activity;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\AutomatedReportsRepository;
use Jiminny\Services\Activity\CrmOwnerResolver;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\UserPilot\UserPilotClient;
/**
* Class JiminnyDebugCommand
*
* @package Jiminny\Console\Commands
*/
class JiminnyDebugCommand extends Command
{
public const string FREQUENCY_DAILY = 'daily';
public const string FREQUENCY_WEEKLY = 'weekly';
public const string FREQUENCY_MONTHLY = 'monthly';
public const string FREQUENCY_QUARTERLY = 'quarterly';
public const string FREQUENCY_ONE_OFF = 'one_off';
protected $signature = 'jiminny:debug';
public function handle(
JobDispatcherInterface $jobDispatcher,
AutomatedReportsService $automatedReportsService,
AutomatedReportsRepository $automatedReportsRepository,
UserPilotClient $userPilotClient
): void {
$this->rateLimit();
exit(1);
$report = AutomatedReport::find(71);
$last = AutomatedReportResult::query()
->where('report_id', $report->getId())
->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])
// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)
->whereDate('created_at', CarbonImmutable::now()->toDateString())
->latest()
->first();
$this->info("Last: {$last->getId()}");
exit(1);
$user = User::find(143);
// $count = $automatedReportsRepository->countUserReports($user);
// $this->info("Count: {$count}");
// $count = $automatedReportsRepository->countAllUserReports($user);
// $this->info("All count: {$count}");
$payload = [
'report_type' => 'ask_jiminny',
'frequency' => 'weekly',
];
$userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);
exit(1);
$now = Carbon::now()->subDay(1);
$this->info("Now: {$now->toDateTimeString()}");
$weekStart = Carbon::getWeekStartsAt();
$this->info("Now: {$weekStart}");
// $from = $now->copy()->previousWeekday()->startOfDay();
// $to = $now->copy()->previousWeekday()->endOfDay();
// $fromOld = $now->copy()->subWeeks(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subWeek()->startOfWeek();
// $toNew = $now->copy()->subWeek()->endOfWeek();
// $fromOld = $now->copy()->subMonths(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();
// $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();
$fromOld = $now->copy()->subMonths(3)->startOfDay();
$toOld = $now->copy()->subDay()->endOfDay();
$fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();
$toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();
$this->info("From old: {$fromOld->toDateTimeString()}");
$this->info("To old: {$toOld->toDateTimeString()}");
$this->info("From new: {$fromNew->toDateTimeString()}");
$this->info("To new: {$toNew->toDateTimeString()}");
exit(1);
$report = AutomatedReport::find(71);
$job = new RequestGenerateAskJiminnyReportJob($report->getUuid());
$jobDispatcher->dispatch($job);
exit(1);
// $this->formatDate($jobDispatcher);
// $this->sendMail($jobDispatcher, $automatedReportsService);
// $this->crmService();
$this->getPayload($automatedReportsService);
exit(1);
}
private function crmService()
{
$activity = Activity::find(418141);
$team = Team::find(19);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
$crmService->createTranscriptNotes($activity);
}
private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)
{
$reportUuid = '';
// $report = $automatedReportsService->getReportResult($reportUuid);
$report = AutomatedReportResult::find(275);
$validRecipients = $automatedReportsService->getValidRecipientUsers(
$report->getReport(),
includeJiminny: true,
);
$recipient = $validRecipients[0];
$fileName = $automatedReportsService->getReportFileName($report);
$typeName = $report->getReport()->getCustomName()
?? $automatedReportsService->getReportTypeName($report);
$teamsName = $automatedReportsService->getReportTeamsName($report);
$periodName = $automatedReportsService->getReportPeriodName($report);
$s3Path = $automatedReportsService->getMediaPath($report);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));
$jobDispatcher->dispatch(
new SendReportMailJob(
reportUuid: $report->getUuid(),
s3Path: $s3Path,
recipientEmail: $recipient['email'],
recipientName: $recipient['name'] ?? null,
fileName: $fileName,
typeName: $typeName,
teamsName: $teamsName,
periodName: $periodName,
isAskJiminny: true,
)
);
exit(1);
}
private function formatDate(JobDispatcherInterface $jobDispatcher): void
{
$customName = 'Custom report name';
// $frequency = self::FREQUENCY_DAILY;
// $frequency = self::FREQUENCY_WEEKLY;
$frequency = self::FREQUENCY_MONTHLY;
// $frequency = self::FREQUENCY_QUARTERLY;
// $frequency = self::FREQUENCY_ONE_OFF;
$period = $this->calculateFromAndToDatePeriod($frequency);
$from = $period['fromDate'];
$to = $period['toDate'];
$periodName = $this->formatReportPeriodName($frequency, $from, $to);
$filenameSuffix = null;
if ($customName) {
if ($filenameSuffix) {
$customName .= " {$filenameSuffix}";
}
$result = $this->sanitizeFileName("{$customName} - {$periodName}");
}
$this->info($result);
}
public function calculateFromAndToDatePeriod(
string $frequency,
?Carbon $fromDate = null,
?Carbon $toDate = null
): array {
if ($frequency === self::FREQUENCY_ONE_OFF) {
return [
'fromDate' => $fromDate,
'toDate' => $toDate,
];
}
$now = Carbon::now();
return match ($frequency) {
self::FREQUENCY_DAILY => [
'fromDate' => $now->copy()->subDay()->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_WEEKLY => [
'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_MONTHLY => [
'fromDate' => $now->copy()->subMonths(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_QUARTERLY => [
'fromDate' => $now->copy()->subMonths(3)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
default => throw new InvalidArgumentException("Unsupported frequency: {$frequency}"),
};
}
private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string
{
$fromYear = $from->format('Y');
$toYear = $to->format('Y');
$differentYears = $fromYear !== $toYear;
switch ($frequency) {
case self::FREQUENCY_DAILY:
return $from->format('j M Y');
case self::FREQUENCY_QUARTERLY:
// 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ
$startMonth = $from->format('M');
$endMonth = $to->copy()->subMonth();
$endMonthName = $endMonth->format('M');
$endMonthYear = $endMonth->format('Y');
if ($differentYears) {
return "{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}";
}
return "{$startMonth} - {$endMonthName} {$toYear}";
case self::FREQUENCY_MONTHLY:
// 'May 2025' - monthly reports are always within the same year
return $from->format('M Y');
case self::FREQUENCY_WEEKLY:
// '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ
$startDay = $from->format('j');
$endDay = $to->format('j');
$startMonth = $from->format('M');
$endMonth = $to->format('M');
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
if ($startMonth !== $endMonth) {
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
}
return "{$startDay} - {$endDay} {$endMonth} {$toYear}";
case self::FREQUENCY_ONE_OFF:
// '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ
$startDay = $from->format('j');
$startMonth = $from->format('M');
$endDay = $to->format('j');
$endMonth = $to->format('M');
// If same month and year, use a format like '2-31 May 2025'
if ($startMonth === $endMonth && ! $differentYears) {
return "{$startDay} - {$endDay} {$startMonth} {$toYear}";
}
// If different years, include both years
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
// Same year but different months
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
default:
// Default format for unknown frequencies
return $from->format('j M Y') . ' - ' . $to->format('j M Y');
}
}
public function sanitizeFileName(string $fileName): string
{
return str_replace(['/', '\\'], '-', $fileName);
}
private function getPayload(AutomatedReportsService $automatedReportsService)
{
$reportResult = AutomatedReportResult::find(269);
$automatedReport = $reportResult->getReport();
$activityIds = [1,2,3];
$payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(
automatedReport: $automatedReport,
reportResult: $reportResult,
activityIds: $activityIds,
);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));
}
private function rateLimit()
{
$team = Team::find(2);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
for ($i = 0 ; $i < 3; $i++) {
// if ($i % 25 === 0) {
// $this->info("Syncing opportunity {$i}");
$this->info("Matching contact {$i}");
// }
// $crmService->syncOpportunity('374720564');
$crmService->matchByName('Robot');
}
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
4690
|
169
|
24
|
2026-05-07T14:21:36.827971+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778163696827_m1.jpg...
|
PhpStorm
|
faVsco.js – custom.log
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {"headers":{"Date":["Thu, 07 May 2026 14:21:15 GMT"],"Content-Type":["application/json;charset=utf-8"],"Transfer-Encoding":["chunked"],"Connection":["keep-alive"],"CF-Ray":["9f80deb8db60dc3a-SOF"],"CF-Cache-Status":["DYNAMIC"],"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],"Vary":["origin, accept-encoding"],"access-control-allow-credentials":["false"],"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\", cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],"x-content-type-options":["nosniff"],"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu, 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],"Report-To":["{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],\"group\":\"cf-nel\",\"max_age\":604800}"],"NEL":["{\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}"],"Server":["cloudflare"]}} {"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab","trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Code changed:
Hide
Sync Changes
Hide This Notification
5
120
5
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Console\Commands;
use Carbon\Carbon;
use Carbon\CarbonImmutable;
use Illuminate\Console\Command;
use InvalidArgumentException;
use Jiminny\Jobs\AutomatedReports\RequestGenerateAskJiminnyReportJob;
use Jiminny\Jobs\AutomatedReports\SendReportMailJob;
use Jiminny\Jobs\JobDispatcherInterface;
use Jiminny\Models\Activity;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\AutomatedReportsRepository;
use Jiminny\Services\Activity\CrmOwnerResolver;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\UserPilot\UserPilotClient;
/**
* Class JiminnyDebugCommand
*
* @package Jiminny\Console\Commands
*/
class JiminnyDebugCommand extends Command
{
public const string FREQUENCY_DAILY = 'daily';
public const string FREQUENCY_WEEKLY = 'weekly';
public const string FREQUENCY_MONTHLY = 'monthly';
public const string FREQUENCY_QUARTERLY = 'quarterly';
public const string FREQUENCY_ONE_OFF = 'one_off';
protected $signature = 'jiminny:debug';
public function handle(
JobDispatcherInterface $jobDispatcher,
AutomatedReportsService $automatedReportsService,
AutomatedReportsRepository $automatedReportsRepository,
UserPilotClient $userPilotClient
): void {
$this->rateLimit();
exit(1);
$report = AutomatedReport::find(71);
$last = AutomatedReportResult::query()
->where('report_id', $report->getId())
->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])
// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)
->whereDate('created_at', CarbonImmutable::now()->toDateString())
->latest()
->first();
$this->info("Last: {$last->getId()}");
exit(1);
$user = User::find(143);
// $count = $automatedReportsRepository->countUserReports($user);
// $this->info("Count: {$count}");
// $count = $automatedReportsRepository->countAllUserReports($user);
// $this->info("All count: {$count}");
$payload = [
'report_type' => 'ask_jiminny',
'frequency' => 'weekly',
];
$userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);
exit(1);
$now = Carbon::now()->subDay(1);
$this->info("Now: {$now->toDateTimeString()}");
$weekStart = Carbon::getWeekStartsAt();
$this->info("Now: {$weekStart}");
// $from = $now->copy()->previousWeekday()->startOfDay();
// $to = $now->copy()->previousWeekday()->endOfDay();
// $fromOld = $now->copy()->subWeeks(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subWeek()->startOfWeek();
// $toNew = $now->copy()->subWeek()->endOfWeek();
// $fromOld = $now->copy()->subMonths(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();
// $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();
$fromOld = $now->copy()->subMonths(3)->startOfDay();
$toOld = $now->copy()->subDay()->endOfDay();
$fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();
$toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();
$this->info("From old: {$fromOld->toDateTimeString()}");
$this->info("To old: {$toOld->toDateTimeString()}");
$this->info("From new: {$fromNew->toDateTimeString()}");
$this->info("To new: {$toNew->toDateTimeString()}");
exit(1);
$report = AutomatedReport::find(71);
$job = new RequestGenerateAskJiminnyReportJob($report->getUuid());
$jobDispatcher->dispatch($job);
exit(1);
// $this->formatDate($jobDispatcher);
// $this->sendMail($jobDispatcher, $automatedReportsService);
// $this->crmService();
$this->getPayload($automatedReportsService);
exit(1);
}
private function crmService()
{
$activity = Activity::find(418141);
$team = Team::find(19);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
$crmService->createTranscriptNotes($activity);
}
private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)
{
$reportUuid = '';
// $report = $automatedReportsService->getReportResult($reportUuid);
$report = AutomatedReportResult::find(275);
$validRecipients = $automatedReportsService->getValidRecipientUsers(
$report->getReport(),
includeJiminny: true,
);
$recipient = $validRecipients[0];
$fileName = $automatedReportsService->getReportFileName($report);
$typeName = $report->getReport()->getCustomName()
?? $automatedReportsService->getReportTypeName($report);
$teamsName = $automatedReportsService->getReportTeamsName($report);
$periodName = $automatedReportsService->getReportPeriodName($report);
$s3Path = $automatedReportsService->getMediaPath($report);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));
$jobDispatcher->dispatch(
new SendReportMailJob(
reportUuid: $report->getUuid(),
s3Path: $s3Path,
recipientEmail: $recipient['email'],
recipientName: $recipient['name'] ?? null,
fileName: $fileName,
typeName: $typeName,
teamsName: $teamsName,
periodName: $periodName,
isAskJiminny: true,
)
);
exit(1);
}
private function formatDate(JobDispatcherInterface $jobDispatcher): void
{
$customName = 'Custom report name';
// $frequency = self::FREQUENCY_DAILY;
// $frequency = self::FREQUENCY_WEEKLY;
$frequency = self::FREQUENCY_MONTHLY;
// $frequency = self::FREQUENCY_QUARTERLY;
// $frequency = self::FREQUENCY_ONE_OFF;
$period = $this->calculateFromAndToDatePeriod($frequency);
$from = $period['fromDate'];
$to = $period['toDate'];
$periodName = $this->formatReportPeriodName($frequency, $from, $to);
$filenameSuffix = null;
if ($customName) {
if ($filenameSuffix) {
$customName .= " {$filenameSuffix}";
}
$result = $this->sanitizeFileName("{$customName} - {$periodName}");
}
$this->info($result);
}
public function calculateFromAndToDatePeriod(
string $frequency,
?Carbon $fromDate = null,
?Carbon $toDate = null
): array {
if ($frequency === self::FREQUENCY_ONE_OFF) {
return [
'fromDate' => $fromDate,
'toDate' => $toDate,
];
}
$now = Carbon::now();
return match ($frequency) {
self::FREQUENCY_DAILY => [
'fromDate' => $now->copy()->subDay()->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_WEEKLY => [
'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_MONTHLY => [
'fromDate' => $now->copy()->subMonths(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_QUARTERLY => [
'fromDate' => $now->copy()->subMonths(3)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
default => throw new InvalidArgumentException("Unsupported frequency: {$frequency}"),
};
}
private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string
{
$fromYear = $from->format('Y');
$toYear = $to->format('Y');
$differentYears = $fromYear !== $toYear;
switch ($frequency) {
case self::FREQUENCY_DAILY:
return $from->format('j M Y');
case self::FREQUENCY_QUARTERLY:
// 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ
$startMonth = $from->format('M');
$endMonth = $to->copy()->subMonth();
$endMonthName = $endMonth->format('M');
$endMonthYear = $endMonth->format('Y');
if ($differentYears) {
return "{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}";
}
return "{$startMonth} - {$endMonthName} {$toYear}";
case self::FREQUENCY_MONTHLY:
// 'May 2025' - monthly reports are always within the same year
return $from->format('M Y');
case self::FREQUENCY_WEEKLY:
// '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ
$startDay = $from->format('j');
$endDay = $to->format('j');
$startMonth = $from->format('M');
$endMonth = $to->format('M');
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
if ($startMonth !== $endMonth) {
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
}
return "{$startDay} - {$endDay} {$endMonth} {$toYear}";
case self::FREQUENCY_ONE_OFF:
// '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ
$startDay = $from->format('j');
$startMonth = $from->format('M');
$endDay = $to->format('j');
$endMonth = $to->format('M');
// If same month and year, use a format like '2-31 May 2025'
if ($startMonth === $endMonth && ! $differentYears) {
return "{$startDay} - {$endDay} {$startMonth} {$toYear}";
}
// If different years, include both years
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
// Same year but different months
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
default:
// Default format for unknown frequencies
return $from->format('j M Y') . ' - ' . $to->format('j M Y');
}
}
public function sanitizeFileName(string $fileName): string
{
return str_replace(['/', '\\'], '-', $fileName);
}
private function getPayload(AutomatedReportsService $automatedReportsService)
{
$reportResult = AutomatedReportResult::find(269);
$automatedReport = $reportResult->getReport();
$activityIds = [1,2,3];
$payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(
automatedReport: $automatedReport,
reportResult: $reportResult,
activityIds: $activityIds,
);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));
}
private function rateLimit()
{
$team = Team::find(2);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
for ($i = 0 ; $i < 3; $i++) {
// if ($i % 25 === 0) {
// $this->info("Syncing opportunity {$i}");
$this->info("Matching contact {$i}");
// }
// $crmService->syncOpportunity('374720564');
$crmService->matchByName('Robot');
}
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"master, menu","depth":5,"on_screen":true,"help_text":"Git Branch: master<br/>Some incoming commits are not fetched<br/>","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\"headers\":{\"Date\":[\"Thu, 07 May 2026 14:21:15 GMT\"],\"Content-Type\":[\"application/json;charset=utf-8\"],\"Transfer-Encoding\":[\"chunked\"],\"Connection\":[\"keep-alive\"],\"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\"CF-Cache-Status\":[\"DYNAMIC\"],\"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\"Vary\":[\"origin, accept-encoding\"],\"access-control-allow-credentials\":[\"false\"],\"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\", cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\"x-content-type-options\":[\"nosniff\"],\"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu, 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\"Report-To\":[\"{\\\"endpoints\\\":[{\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\\\"group\\\":\\\"cf-nel\\\",\\\"max_age\\\":604800}\"],\"NEL\":[\"{\\\"success_fraction\\\":0.01,\\\"report_to\\\":\\\"cf-nel\\\",\\\"max_age\\\":604800}\"],\"Server\":[\"cloudflare\"]}} {\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\"headers\":{\"Date\":[\"Thu, 07 May 2026 14:21:15 GMT\"],\"Content-Type\":[\"application/json;charset=utf-8\"],\"Transfer-Encoding\":[\"chunked\"],\"Connection\":[\"keep-alive\"],\"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\"CF-Cache-Status\":[\"DYNAMIC\"],\"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\"Vary\":[\"origin, accept-encoding\"],\"access-control-allow-credentials\":[\"false\"],\"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\", cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\"x-content-type-options\":[\"nosniff\"],\"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu, 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\"Report-To\":[\"{\\\"endpoints\\\":[{\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\\\"group\\\":\\\"cf-nel\\\",\\\"max_age\\\":604800}\"],\"NEL\":[\"{\\\"success_fraction\\\":0.01,\\\"report_to\\\":\\\"cf-nel\\\",\\\"max_age\\\":604800}\"],\"Server\":[\"cloudflare\"]}} {\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"5","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"120","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Console\\Commands;\n\nuse Carbon\\Carbon;\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Console\\Command;\nuse InvalidArgumentException;\nuse Jiminny\\Jobs\\AutomatedReports\\RequestGenerateAskJiminnyReportJob;\nuse Jiminny\\Jobs\\AutomatedReports\\SendReportMailJob;\nuse Jiminny\\Jobs\\JobDispatcherInterface;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\AutomatedReportsRepository;\nuse Jiminny\\Services\\Activity\\CrmOwnerResolver;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\UserPilot\\UserPilotClient;\n\n/**\n * Class JiminnyDebugCommand\n *\n * @package Jiminny\\Console\\Commands\n */\nclass JiminnyDebugCommand extends Command\n{\n public const string FREQUENCY_DAILY = 'daily';\n public const string FREQUENCY_WEEKLY = 'weekly';\n public const string FREQUENCY_MONTHLY = 'monthly';\n public const string FREQUENCY_QUARTERLY = 'quarterly';\n public const string FREQUENCY_ONE_OFF = 'one_off';\n protected $signature = 'jiminny:debug';\n\n public function handle(\n JobDispatcherInterface $jobDispatcher,\n AutomatedReportsService $automatedReportsService,\n AutomatedReportsRepository $automatedReportsRepository,\n UserPilotClient $userPilotClient\n ): void {\n $this->rateLimit();\n exit(1);\n\n\n\n $report = AutomatedReport::find(71);\n $last = AutomatedReportResult::query()\n ->where('report_id', $report->getId())\n ->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])\n// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)\n ->whereDate('created_at', CarbonImmutable::now()->toDateString())\n ->latest()\n ->first();\n\n $this->info(\"Last: {$last->getId()}\");\n\n exit(1);\n\n $user = User::find(143);\n // $count = $automatedReportsRepository->countUserReports($user);\n // $this->info(\"Count: {$count}\");\n // $count = $automatedReportsRepository->countAllUserReports($user);\n // $this->info(\"All count: {$count}\");\n\n $payload = [\n 'report_type' => 'ask_jiminny',\n 'frequency' => 'weekly',\n ];\n $userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);\n\n exit(1);\n\n $now = Carbon::now()->subDay(1);\n $this->info(\"Now: {$now->toDateTimeString()}\");\n $weekStart = Carbon::getWeekStartsAt();\n $this->info(\"Now: {$weekStart}\");\n\n // $from = $now->copy()->previousWeekday()->startOfDay();\n // $to = $now->copy()->previousWeekday()->endOfDay();\n\n // $fromOld = $now->copy()->subWeeks(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subWeek()->startOfWeek();\n // $toNew = $now->copy()->subWeek()->endOfWeek();\n\n // $fromOld = $now->copy()->subMonths(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();\n // $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();\n\n $fromOld = $now->copy()->subMonths(3)->startOfDay();\n $toOld = $now->copy()->subDay()->endOfDay();\n $fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();\n $toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();\n\n $this->info(\"From old: {$fromOld->toDateTimeString()}\");\n $this->info(\"To old: {$toOld->toDateTimeString()}\");\n $this->info(\"From new: {$fromNew->toDateTimeString()}\");\n $this->info(\"To new: {$toNew->toDateTimeString()}\");\n\n exit(1);\n\n $report = AutomatedReport::find(71);\n\n $job = new RequestGenerateAskJiminnyReportJob($report->getUuid());\n $jobDispatcher->dispatch($job);\n\n exit(1);\n\n\n // $this->formatDate($jobDispatcher);\n // $this->sendMail($jobDispatcher, $automatedReportsService);\n // $this->crmService();\n\n $this->getPayload($automatedReportsService);\n\n exit(1);\n }\n\n\n\n private function crmService()\n {\n $activity = Activity::find(418141);\n\n $team = Team::find(19);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n $crmService->createTranscriptNotes($activity);\n }\n\n private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)\n {\n $reportUuid = '';\n // $report = $automatedReportsService->getReportResult($reportUuid);\n $report = AutomatedReportResult::find(275);\n $validRecipients = $automatedReportsService->getValidRecipientUsers(\n $report->getReport(),\n includeJiminny: true,\n );\n\n $recipient = $validRecipients[0];\n\n $fileName = $automatedReportsService->getReportFileName($report);\n $typeName = $report->getReport()->getCustomName()\n ?? $automatedReportsService->getReportTypeName($report);\n $teamsName = $automatedReportsService->getReportTeamsName($report);\n $periodName = $automatedReportsService->getReportPeriodName($report);\n $s3Path = $automatedReportsService->getMediaPath($report);\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));\n\n $jobDispatcher->dispatch(\n new SendReportMailJob(\n reportUuid: $report->getUuid(),\n s3Path: $s3Path,\n recipientEmail: $recipient['email'],\n recipientName: $recipient['name'] ?? null,\n fileName: $fileName,\n typeName: $typeName,\n teamsName: $teamsName,\n periodName: $periodName,\n isAskJiminny: true,\n )\n );\n\n exit(1);\n }\n\n private function formatDate(JobDispatcherInterface $jobDispatcher): void\n {\n $customName = 'Custom report name';\n // $frequency = self::FREQUENCY_DAILY;\n // $frequency = self::FREQUENCY_WEEKLY;\n $frequency = self::FREQUENCY_MONTHLY;\n // $frequency = self::FREQUENCY_QUARTERLY;\n // $frequency = self::FREQUENCY_ONE_OFF;\n $period = $this->calculateFromAndToDatePeriod($frequency);\n $from = $period['fromDate'];\n $to = $period['toDate'];\n $periodName = $this->formatReportPeriodName($frequency, $from, $to);\n $filenameSuffix = null;\n\n if ($customName) {\n if ($filenameSuffix) {\n $customName .= \" {$filenameSuffix}\";\n }\n\n $result = $this->sanitizeFileName(\"{$customName} - {$periodName}\");\n }\n\n $this->info($result);\n }\n\n public function calculateFromAndToDatePeriod(\n string $frequency,\n ?Carbon $fromDate = null,\n ?Carbon $toDate = null\n ): array {\n if ($frequency === self::FREQUENCY_ONE_OFF) {\n return [\n 'fromDate' => $fromDate,\n 'toDate' => $toDate,\n ];\n }\n\n $now = Carbon::now();\n\n return match ($frequency) {\n self::FREQUENCY_DAILY => [\n 'fromDate' => $now->copy()->subDay()->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_WEEKLY => [\n 'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_MONTHLY => [\n 'fromDate' => $now->copy()->subMonths(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_QUARTERLY => [\n 'fromDate' => $now->copy()->subMonths(3)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n default => throw new InvalidArgumentException(\"Unsupported frequency: {$frequency}\"),\n };\n }\n\n private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string\n {\n $fromYear = $from->format('Y');\n $toYear = $to->format('Y');\n $differentYears = $fromYear !== $toYear;\n\n switch ($frequency) {\n case self::FREQUENCY_DAILY:\n return $from->format('j M Y');\n\n case self::FREQUENCY_QUARTERLY:\n // 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ\n $startMonth = $from->format('M');\n $endMonth = $to->copy()->subMonth();\n $endMonthName = $endMonth->format('M');\n $endMonthYear = $endMonth->format('Y');\n\n if ($differentYears) {\n return \"{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}\";\n }\n\n return \"{$startMonth} - {$endMonthName} {$toYear}\";\n\n case self::FREQUENCY_MONTHLY:\n // 'May 2025' - monthly reports are always within the same year\n return $from->format('M Y');\n\n case self::FREQUENCY_WEEKLY:\n // '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ\n $startDay = $from->format('j');\n $endDay = $to->format('j');\n $startMonth = $from->format('M');\n $endMonth = $to->format('M');\n\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n if ($startMonth !== $endMonth) {\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n return \"{$startDay} - {$endDay} {$endMonth} {$toYear}\";\n\n case self::FREQUENCY_ONE_OFF:\n // '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ\n $startDay = $from->format('j');\n $startMonth = $from->format('M');\n $endDay = $to->format('j');\n $endMonth = $to->format('M');\n\n // If same month and year, use a format like '2-31 May 2025'\n if ($startMonth === $endMonth && ! $differentYears) {\n return \"{$startDay} - {$endDay} {$startMonth} {$toYear}\";\n }\n\n // If different years, include both years\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n // Same year but different months\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n\n default:\n // Default format for unknown frequencies\n return $from->format('j M Y') . ' - ' . $to->format('j M Y');\n }\n }\n\n public function sanitizeFileName(string $fileName): string\n {\n return str_replace(['/', '\\\\'], '-', $fileName);\n }\n\n private function getPayload(AutomatedReportsService $automatedReportsService)\n {\n $reportResult = AutomatedReportResult::find(269);\n $automatedReport = $reportResult->getReport();\n $activityIds = [1,2,3];\n $payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(\n automatedReport: $automatedReport,\n reportResult: $reportResult,\n activityIds: $activityIds,\n );\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));\n }\n\n private function rateLimit()\n {\n $team = Team::find(2);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n for ($i = 0 ; $i < 3; $i++) {\n// if ($i % 25 === 0) {\n// $this->info(\"Syncing opportunity {$i}\");\n $this->info(\"Matching contact {$i}\");\n// }\n// $crmService->syncOpportunity('374720564');\n $crmService->matchByName('Robot');\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Console\\Commands;\n\nuse Carbon\\Carbon;\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Console\\Command;\nuse InvalidArgumentException;\nuse Jiminny\\Jobs\\AutomatedReports\\RequestGenerateAskJiminnyReportJob;\nuse Jiminny\\Jobs\\AutomatedReports\\SendReportMailJob;\nuse Jiminny\\Jobs\\JobDispatcherInterface;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\AutomatedReportsRepository;\nuse Jiminny\\Services\\Activity\\CrmOwnerResolver;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\UserPilot\\UserPilotClient;\n\n/**\n * Class JiminnyDebugCommand\n *\n * @package Jiminny\\Console\\Commands\n */\nclass JiminnyDebugCommand extends Command\n{\n public const string FREQUENCY_DAILY = 'daily';\n public const string FREQUENCY_WEEKLY = 'weekly';\n public const string FREQUENCY_MONTHLY = 'monthly';\n public const string FREQUENCY_QUARTERLY = 'quarterly';\n public const string FREQUENCY_ONE_OFF = 'one_off';\n protected $signature = 'jiminny:debug';\n\n public function handle(\n JobDispatcherInterface $jobDispatcher,\n AutomatedReportsService $automatedReportsService,\n AutomatedReportsRepository $automatedReportsRepository,\n UserPilotClient $userPilotClient\n ): void {\n $this->rateLimit();\n exit(1);\n\n\n\n $report = AutomatedReport::find(71);\n $last = AutomatedReportResult::query()\n ->where('report_id', $report->getId())\n ->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])\n// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)\n ->whereDate('created_at', CarbonImmutable::now()->toDateString())\n ->latest()\n ->first();\n\n $this->info(\"Last: {$last->getId()}\");\n\n exit(1);\n\n $user = User::find(143);\n // $count = $automatedReportsRepository->countUserReports($user);\n // $this->info(\"Count: {$count}\");\n // $count = $automatedReportsRepository->countAllUserReports($user);\n // $this->info(\"All count: {$count}\");\n\n $payload = [\n 'report_type' => 'ask_jiminny',\n 'frequency' => 'weekly',\n ];\n $userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);\n\n exit(1);\n\n $now = Carbon::now()->subDay(1);\n $this->info(\"Now: {$now->toDateTimeString()}\");\n $weekStart = Carbon::getWeekStartsAt();\n $this->info(\"Now: {$weekStart}\");\n\n // $from = $now->copy()->previousWeekday()->startOfDay();\n // $to = $now->copy()->previousWeekday()->endOfDay();\n\n // $fromOld = $now->copy()->subWeeks(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subWeek()->startOfWeek();\n // $toNew = $now->copy()->subWeek()->endOfWeek();\n\n // $fromOld = $now->copy()->subMonths(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();\n // $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();\n\n $fromOld = $now->copy()->subMonths(3)->startOfDay();\n $toOld = $now->copy()->subDay()->endOfDay();\n $fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();\n $toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();\n\n $this->info(\"From old: {$fromOld->toDateTimeString()}\");\n $this->info(\"To old: {$toOld->toDateTimeString()}\");\n $this->info(\"From new: {$fromNew->toDateTimeString()}\");\n $this->info(\"To new: {$toNew->toDateTimeString()}\");\n\n exit(1);\n\n $report = AutomatedReport::find(71);\n\n $job = new RequestGenerateAskJiminnyReportJob($report->getUuid());\n $jobDispatcher->dispatch($job);\n\n exit(1);\n\n\n // $this->formatDate($jobDispatcher);\n // $this->sendMail($jobDispatcher, $automatedReportsService);\n // $this->crmService();\n\n $this->getPayload($automatedReportsService);\n\n exit(1);\n }\n\n\n\n private function crmService()\n {\n $activity = Activity::find(418141);\n\n $team = Team::find(19);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n $crmService->createTranscriptNotes($activity);\n }\n\n private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)\n {\n $reportUuid = '';\n // $report = $automatedReportsService->getReportResult($reportUuid);\n $report = AutomatedReportResult::find(275);\n $validRecipients = $automatedReportsService->getValidRecipientUsers(\n $report->getReport(),\n includeJiminny: true,\n );\n\n $recipient = $validRecipients[0];\n\n $fileName = $automatedReportsService->getReportFileName($report);\n $typeName = $report->getReport()->getCustomName()\n ?? $automatedReportsService->getReportTypeName($report);\n $teamsName = $automatedReportsService->getReportTeamsName($report);\n $periodName = $automatedReportsService->getReportPeriodName($report);\n $s3Path = $automatedReportsService->getMediaPath($report);\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));\n\n $jobDispatcher->dispatch(\n new SendReportMailJob(\n reportUuid: $report->getUuid(),\n s3Path: $s3Path,\n recipientEmail: $recipient['email'],\n recipientName: $recipient['name'] ?? null,\n fileName: $fileName,\n typeName: $typeName,\n teamsName: $teamsName,\n periodName: $periodName,\n isAskJiminny: true,\n )\n );\n\n exit(1);\n }\n\n private function formatDate(JobDispatcherInterface $jobDispatcher): void\n {\n $customName = 'Custom report name';\n // $frequency = self::FREQUENCY_DAILY;\n // $frequency = self::FREQUENCY_WEEKLY;\n $frequency = self::FREQUENCY_MONTHLY;\n // $frequency = self::FREQUENCY_QUARTERLY;\n // $frequency = self::FREQUENCY_ONE_OFF;\n $period = $this->calculateFromAndToDatePeriod($frequency);\n $from = $period['fromDate'];\n $to = $period['toDate'];\n $periodName = $this->formatReportPeriodName($frequency, $from, $to);\n $filenameSuffix = null;\n\n if ($customName) {\n if ($filenameSuffix) {\n $customName .= \" {$filenameSuffix}\";\n }\n\n $result = $this->sanitizeFileName(\"{$customName} - {$periodName}\");\n }\n\n $this->info($result);\n }\n\n public function calculateFromAndToDatePeriod(\n string $frequency,\n ?Carbon $fromDate = null,\n ?Carbon $toDate = null\n ): array {\n if ($frequency === self::FREQUENCY_ONE_OFF) {\n return [\n 'fromDate' => $fromDate,\n 'toDate' => $toDate,\n ];\n }\n\n $now = Carbon::now();\n\n return match ($frequency) {\n self::FREQUENCY_DAILY => [\n 'fromDate' => $now->copy()->subDay()->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_WEEKLY => [\n 'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_MONTHLY => [\n 'fromDate' => $now->copy()->subMonths(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_QUARTERLY => [\n 'fromDate' => $now->copy()->subMonths(3)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n default => throw new InvalidArgumentException(\"Unsupported frequency: {$frequency}\"),\n };\n }\n\n private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string\n {\n $fromYear = $from->format('Y');\n $toYear = $to->format('Y');\n $differentYears = $fromYear !== $toYear;\n\n switch ($frequency) {\n case self::FREQUENCY_DAILY:\n return $from->format('j M Y');\n\n case self::FREQUENCY_QUARTERLY:\n // 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ\n $startMonth = $from->format('M');\n $endMonth = $to->copy()->subMonth();\n $endMonthName = $endMonth->format('M');\n $endMonthYear = $endMonth->format('Y');\n\n if ($differentYears) {\n return \"{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}\";\n }\n\n return \"{$startMonth} - {$endMonthName} {$toYear}\";\n\n case self::FREQUENCY_MONTHLY:\n // 'May 2025' - monthly reports are always within the same year\n return $from->format('M Y');\n\n case self::FREQUENCY_WEEKLY:\n // '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ\n $startDay = $from->format('j');\n $endDay = $to->format('j');\n $startMonth = $from->format('M');\n $endMonth = $to->format('M');\n\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n if ($startMonth !== $endMonth) {\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n return \"{$startDay} - {$endDay} {$endMonth} {$toYear}\";\n\n case self::FREQUENCY_ONE_OFF:\n // '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ\n $startDay = $from->format('j');\n $startMonth = $from->format('M');\n $endDay = $to->format('j');\n $endMonth = $to->format('M');\n\n // If same month and year, use a format like '2-31 May 2025'\n if ($startMonth === $endMonth && ! $differentYears) {\n return \"{$startDay} - {$endDay} {$startMonth} {$toYear}\";\n }\n\n // If different years, include both years\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n // Same year but different months\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n\n default:\n // Default format for unknown frequencies\n return $from->format('j M Y') . ' - ' . $to->format('j M Y');\n }\n }\n\n public function sanitizeFileName(string $fileName): string\n {\n return str_replace(['/', '\\\\'], '-', $fileName);\n }\n\n private function getPayload(AutomatedReportsService $automatedReportsService)\n {\n $reportResult = AutomatedReportResult::find(269);\n $automatedReport = $reportResult->getReport();\n $activityIds = [1,2,3];\n $payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(\n automatedReport: $automatedReport,\n reportResult: $reportResult,\n activityIds: $activityIds,\n );\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));\n }\n\n private function rateLimit()\n {\n $team = Team::find(2);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n for ($i = 0 ; $i < 3; $i++) {\n// if ($i % 25 === 0) {\n// $this->info(\"Syncing opportunity {$i}\");\n $this->info(\"Matching contact {$i}\");\n// }\n// $crmService->syncOpportunity('374720564');\n $crmService->matchByName('Robot');\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8009244190567151207
|
3612303221736435083
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {"headers":{"Date":["Thu, 07 May 2026 14:21:15 GMT"],"Content-Type":["application/json;charset=utf-8"],"Transfer-Encoding":["chunked"],"Connection":["keep-alive"],"CF-Ray":["9f80deb8db60dc3a-SOF"],"CF-Cache-Status":["DYNAMIC"],"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],"Vary":["origin, accept-encoding"],"access-control-allow-credentials":["false"],"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\", cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],"x-content-type-options":["nosniff"],"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu, 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],"Report-To":["{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],\"group\":\"cf-nel\",\"max_age\":604800}"],"NEL":["{\"success_fraction\":0.01,\"report_to\":\"cf-nel\",\"max_age\":604800}"],"Server":["cloudflare"]}} {"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab","trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Code changed:
Hide
Sync Changes
Hide This Notification
5
120
5
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Console\Commands;
use Carbon\Carbon;
use Carbon\CarbonImmutable;
use Illuminate\Console\Command;
use InvalidArgumentException;
use Jiminny\Jobs\AutomatedReports\RequestGenerateAskJiminnyReportJob;
use Jiminny\Jobs\AutomatedReports\SendReportMailJob;
use Jiminny\Jobs\JobDispatcherInterface;
use Jiminny\Models\Activity;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\AutomatedReportsRepository;
use Jiminny\Services\Activity\CrmOwnerResolver;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\UserPilot\UserPilotClient;
/**
* Class JiminnyDebugCommand
*
* @package Jiminny\Console\Commands
*/
class JiminnyDebugCommand extends Command
{
public const string FREQUENCY_DAILY = 'daily';
public const string FREQUENCY_WEEKLY = 'weekly';
public const string FREQUENCY_MONTHLY = 'monthly';
public const string FREQUENCY_QUARTERLY = 'quarterly';
public const string FREQUENCY_ONE_OFF = 'one_off';
protected $signature = 'jiminny:debug';
public function handle(
JobDispatcherInterface $jobDispatcher,
AutomatedReportsService $automatedReportsService,
AutomatedReportsRepository $automatedReportsRepository,
UserPilotClient $userPilotClient
): void {
$this->rateLimit();
exit(1);
$report = AutomatedReport::find(71);
$last = AutomatedReportResult::query()
->where('report_id', $report->getId())
->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])
// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)
->whereDate('created_at', CarbonImmutable::now()->toDateString())
->latest()
->first();
$this->info("Last: {$last->getId()}");
exit(1);
$user = User::find(143);
// $count = $automatedReportsRepository->countUserReports($user);
// $this->info("Count: {$count}");
// $count = $automatedReportsRepository->countAllUserReports($user);
// $this->info("All count: {$count}");
$payload = [
'report_type' => 'ask_jiminny',
'frequency' => 'weekly',
];
$userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);
exit(1);
$now = Carbon::now()->subDay(1);
$this->info("Now: {$now->toDateTimeString()}");
$weekStart = Carbon::getWeekStartsAt();
$this->info("Now: {$weekStart}");
// $from = $now->copy()->previousWeekday()->startOfDay();
// $to = $now->copy()->previousWeekday()->endOfDay();
// $fromOld = $now->copy()->subWeeks(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subWeek()->startOfWeek();
// $toNew = $now->copy()->subWeek()->endOfWeek();
// $fromOld = $now->copy()->subMonths(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();
// $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();
$fromOld = $now->copy()->subMonths(3)->startOfDay();
$toOld = $now->copy()->subDay()->endOfDay();
$fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();
$toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();
$this->info("From old: {$fromOld->toDateTimeString()}");
$this->info("To old: {$toOld->toDateTimeString()}");
$this->info("From new: {$fromNew->toDateTimeString()}");
$this->info("To new: {$toNew->toDateTimeString()}");
exit(1);
$report = AutomatedReport::find(71);
$job = new RequestGenerateAskJiminnyReportJob($report->getUuid());
$jobDispatcher->dispatch($job);
exit(1);
// $this->formatDate($jobDispatcher);
// $this->sendMail($jobDispatcher, $automatedReportsService);
// $this->crmService();
$this->getPayload($automatedReportsService);
exit(1);
}
private function crmService()
{
$activity = Activity::find(418141);
$team = Team::find(19);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
$crmService->createTranscriptNotes($activity);
}
private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)
{
$reportUuid = '';
// $report = $automatedReportsService->getReportResult($reportUuid);
$report = AutomatedReportResult::find(275);
$validRecipients = $automatedReportsService->getValidRecipientUsers(
$report->getReport(),
includeJiminny: true,
);
$recipient = $validRecipients[0];
$fileName = $automatedReportsService->getReportFileName($report);
$typeName = $report->getReport()->getCustomName()
?? $automatedReportsService->getReportTypeName($report);
$teamsName = $automatedReportsService->getReportTeamsName($report);
$periodName = $automatedReportsService->getReportPeriodName($report);
$s3Path = $automatedReportsService->getMediaPath($report);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));
$jobDispatcher->dispatch(
new SendReportMailJob(
reportUuid: $report->getUuid(),
s3Path: $s3Path,
recipientEmail: $recipient['email'],
recipientName: $recipient['name'] ?? null,
fileName: $fileName,
typeName: $typeName,
teamsName: $teamsName,
periodName: $periodName,
isAskJiminny: true,
)
);
exit(1);
}
private function formatDate(JobDispatcherInterface $jobDispatcher): void
{
$customName = 'Custom report name';
// $frequency = self::FREQUENCY_DAILY;
// $frequency = self::FREQUENCY_WEEKLY;
$frequency = self::FREQUENCY_MONTHLY;
// $frequency = self::FREQUENCY_QUARTERLY;
// $frequency = self::FREQUENCY_ONE_OFF;
$period = $this->calculateFromAndToDatePeriod($frequency);
$from = $period['fromDate'];
$to = $period['toDate'];
$periodName = $this->formatReportPeriodName($frequency, $from, $to);
$filenameSuffix = null;
if ($customName) {
if ($filenameSuffix) {
$customName .= " {$filenameSuffix}";
}
$result = $this->sanitizeFileName("{$customName} - {$periodName}");
}
$this->info($result);
}
public function calculateFromAndToDatePeriod(
string $frequency,
?Carbon $fromDate = null,
?Carbon $toDate = null
): array {
if ($frequency === self::FREQUENCY_ONE_OFF) {
return [
'fromDate' => $fromDate,
'toDate' => $toDate,
];
}
$now = Carbon::now();
return match ($frequency) {
self::FREQUENCY_DAILY => [
'fromDate' => $now->copy()->subDay()->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_WEEKLY => [
'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_MONTHLY => [
'fromDate' => $now->copy()->subMonths(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_QUARTERLY => [
'fromDate' => $now->copy()->subMonths(3)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
default => throw new InvalidArgumentException("Unsupported frequency: {$frequency}"),
};
}
private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string
{
$fromYear = $from->format('Y');
$toYear = $to->format('Y');
$differentYears = $fromYear !== $toYear;
switch ($frequency) {
case self::FREQUENCY_DAILY:
return $from->format('j M Y');
case self::FREQUENCY_QUARTERLY:
// 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ
$startMonth = $from->format('M');
$endMonth = $to->copy()->subMonth();
$endMonthName = $endMonth->format('M');
$endMonthYear = $endMonth->format('Y');
if ($differentYears) {
return "{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}";
}
return "{$startMonth} - {$endMonthName} {$toYear}";
case self::FREQUENCY_MONTHLY:
// 'May 2025' - monthly reports are always within the same year
return $from->format('M Y');
case self::FREQUENCY_WEEKLY:
// '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ
$startDay = $from->format('j');
$endDay = $to->format('j');
$startMonth = $from->format('M');
$endMonth = $to->format('M');
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
if ($startMonth !== $endMonth) {
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
}
return "{$startDay} - {$endDay} {$endMonth} {$toYear}";
case self::FREQUENCY_ONE_OFF:
// '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ
$startDay = $from->format('j');
$startMonth = $from->format('M');
$endDay = $to->format('j');
$endMonth = $to->format('M');
// If same month and year, use a format like '2-31 May 2025'
if ($startMonth === $endMonth && ! $differentYears) {
return "{$startDay} - {$endDay} {$startMonth} {$toYear}";
}
// If different years, include both years
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
// Same year but different months
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
default:
// Default format for unknown frequencies
return $from->format('j M Y') . ' - ' . $to->format('j M Y');
}
}
public function sanitizeFileName(string $fileName): string
{
return str_replace(['/', '\\'], '-', $fileName);
}
private function getPayload(AutomatedReportsService $automatedReportsService)
{
$reportResult = AutomatedReportResult::find(269);
$automatedReport = $reportResult->getReport();
$activityIds = [1,2,3];
$payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(
automatedReport: $automatedReport,
reportResult: $reportResult,
activityIds: $activityIds,
);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));
}
private function rateLimit()
{
$team = Team::find(2);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
for ($i = 0 ; $i < 3; $i++) {
// if ($i % 25 === 0) {
// $this->info("Syncing opportunity {$i}");
$this->info("Matching contact {$i}");
// }
// $crmService->syncOpportunity('374720564');
$crmService->matchByName('Robot');
}
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
25462
|
1070
|
7
|
2026-05-12T11:26:07.146735+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778585167146_m1.jpg...
|
Firefox
|
Pipelines - jiminny/app — Work
|
True
|
app.circleci.com/pipelines/github/jiminny/app
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlSupport Daily • in 34 mDOCKER181DEV (-zsh)О 882APP (-zsh)883ec2-user@ip-10-30-129-190:~ec2-user@ip-10-30-129-..84-zshX5screenpipe"O 886100% C78• Tue 12 May 14:26:06181-zsh+For documentation,visit [URL_WITH_CREDENTIALS] ~]$ docker exec -it $(docker ps --format "{{.ID}}" --filter "name=ecs-worker" | head -1) /bin/bash -c "cd /home/jiminny && bash"root@a3efaa2235c4:/home/jiminny# php artisan tinkerPsy Shell v0.12.21 (PHP 8.3.30 - cli) by Justin HilemanNew PHP manual is available (latest: 3.0.5).Update with'doc --update-manual'> Sresult = AutomatedReportResult::find(1872);[!] Aliasing'AutomatedReportResult'to'Jiminny\Models\AutomatedReportResult' for this Tinker session.Jiminny\Models\AutomatedReportResult {#15863id: 1872,uuid: b"CO-0,/x\e¢Ht°ão11",report_id:54,name:"Coaching Profiles - 6 - 12 Apr 2026 - Client Success, UK Sales",media_type: "pdf",parent_id: null,status: 2,reason: 0,payload: "{"team_id":1, "request_id": "822fa41b-afd3-43a9-a248-86b0e36f3131", "report_type":"coaching_profiles", "media_types": ["pdf", "podcast"], "from_date": "2026-04-06T00:00:00+(0:д- ) te 2028-012723-59-59-0:80 Corluduratt n ,21 econsent St Sp (a -requenenenes sta,*" (, ckur' - Ketps :NU2,-me3n, TOlyvaVue*- app many-yoes ö okerracorts\/ready","report_period":"6 - 12 Apr 2026".respoys reoreuerte: °822 Ab- 703-4309-0100k otetriss 3, eust Compl edi", '*inestamp" : 2026-04-13781:11:48 648399-80-80*, 'SB_url" 'S3: VWStminny. el ient-data V/5F0F4810-7e77-4086-8f69-93429ae4d70bV/reportsV/822fa41b-afd3-43a9-a248-86b0e36f3131.MD","report_type":"coaching_profiles","podcast_url":"s3:Vjiminny.client-data\/5f0f4810-7e77-4086-8f69-93429ae4d70b\/reports\/822fa41b-afd3-43a9-a248-86b0e36f3131_podcast.txt","podcast_audio_url":"s3:\//jiminny.client-data\/5f0f4810-7e77-4086-8f69-93429ae4d70b\/reports\/822fa41b-afd3-43a9-a248-86b0e36f3131_podcast.mp3","podcast_ssml_url":"s3:\/jiminny.client-data\/5f0f4810-7e77-4086-8f69-93429ae4d70bVreports\/822fa41b-afd3-43a9-a248-86b0e36f3131_podcast.ssml"}"requested_at: "2026-04-13 01:00:57"generated_at: "2026-04-13 01:11:48",sent_at: null,created_at: "2026-04-13 01:00:27",updated_at: "2026-04-13 01:11:48"> Sresult->status = 4;= 4> Sresult->save();= true> exit...
|
NULL
|
-8008038006738307194
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlSupport Daily • in 34 mDOCKER181DEV (-zsh)О 882APP (-zsh)883ec2-user@ip-10-30-129-190:~ec2-user@ip-10-30-129-..84-zshX5screenpipe"O 886100% C78• Tue 12 May 14:26:06181-zsh+For documentation,visit [URL_WITH_CREDENTIALS] ~]$ docker exec -it $(docker ps --format "{{.ID}}" --filter "name=ecs-worker" | head -1) /bin/bash -c "cd /home/jiminny && bash"root@a3efaa2235c4:/home/jiminny# php artisan tinkerPsy Shell v0.12.21 (PHP 8.3.30 - cli) by Justin HilemanNew PHP manual is available (latest: 3.0.5).Update with'doc --update-manual'> Sresult = AutomatedReportResult::find(1872);[!] Aliasing'AutomatedReportResult'to'Jiminny\Models\AutomatedReportResult' for this Tinker session.Jiminny\Models\AutomatedReportResult {#15863id: 1872,uuid: b"CO-0,/x\e¢Ht°ão11",report_id:54,name:"Coaching Profiles - 6 - 12 Apr 2026 - Client Success, UK Sales",media_type: "pdf",parent_id: null,status: 2,reason: 0,payload: "{"team_id":1, "request_id": "822fa41b-afd3-43a9-a248-86b0e36f3131", "report_type":"coaching_profiles", "media_types": ["pdf", "podcast"], "from_date": "2026-04-06T00:00:00+(0:д- ) te 2028-012723-59-59-0:80 Corluduratt n ,21 econsent St Sp (a -requenenenes sta,*" (, ckur' - Ketps :NU2,-me3n, TOlyvaVue*- app many-yoes ö okerracorts\/ready","report_period":"6 - 12 Apr 2026".respoys reoreuerte: °822 Ab- 703-4309-0100k otetriss 3, eust Compl edi", '*inestamp" : 2026-04-13781:11:48 648399-80-80*, 'SB_url" 'S3: VWStminny. el ient-data V/5F0F4810-7e77-4086-8f69-93429ae4d70bV/reportsV/822fa41b-afd3-43a9-a248-86b0e36f3131.MD","report_type":"coaching_profiles","podcast_url":"s3:Vjiminny.client-data\/5f0f4810-7e77-4086-8f69-93429ae4d70b\/reports\/822fa41b-afd3-43a9-a248-86b0e36f3131_podcast.txt","podcast_audio_url":"s3:\//jiminny.client-data\/5f0f4810-7e77-4086-8f69-93429ae4d70b\/reports\/822fa41b-afd3-43a9-a248-86b0e36f3131_podcast.mp3","podcast_ssml_url":"s3:\/jiminny.client-data\/5f0f4810-7e77-4086-8f69-93429ae4d70bVreports\/822fa41b-afd3-43a9-a248-86b0e36f3131_podcast.ssml"}"requested_at: "2026-04-13 01:00:57"generated_at: "2026-04-13 01:11:48",sent_at: null,created_at: "2026-04-13 01:00:27",updated_at: "2026-04-13 01:11:48"> Sresult->status = 4;= 4> Sresult->save();= true> exit...
|
25461
|
NULL
|
NULL
|
NULL
|
|
18349
|
792
|
32
|
2026-05-11T11:12:41.350555+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497961350_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 48 m100% <78• Mon 11 May 14:12:40181DEV (docker)-zshDOCKERcompiledeventsroutesviews181DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
NULL
|
-8006928121485343487
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 48 m100% <78• Mon 11 May 14:12:40181DEV (docker)-zshDOCKERcompiledeventsroutesviews181DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
23623
|
998
|
9
|
2026-05-12T08:18:29.273687+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778573909273_m1.jpg...
|
Slack
|
Steliyan Georgiev (DM) - Jiminny Inc - 4 new items Steliyan Georgiev (DM) - Jiminny Inc - 4 new items - Slack...
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Petko Kashinski
Steliyan Georgiev
Galya Dimitrova
Aneliya Angelova
Stefka Stoyanova
Vasil Vasilev
Nikolay Ivanov
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Lukas Kovalik
you
Jira Cloud
Toast
Google Calendar
Messages
Messages
Add canvas
Add canvas
Files
Files
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Lukas Kovalik
Today at 10:40:03 AM
10:40 AM
здрасти Стели
Today at 10:40:36 AM
10:40
Галя ме помоли да видим това със липсващ pdf_url на репорти
Today at 10:41:14 AM
10:41
може ли по-късно да се чуем да видим какво може да направим
Steliyan Georgiev
Today at 10:44:58 AM
10:44 AM
Здрасти Лукаш, да
има ли тикет?
Lukas Kovalik
Today at 10:46:01 AM
10:46 AM
https://jiminny.atlassian.net/browse/JY-20776
https://jiminny.atlassian.net/browse/JY-20776
Jira Cloud
Jira Cloud
Remove preview
Jira Cloud Bug JY-20776 Automated report - sentry Bug JY-20776 in Jira Cloud Preview in Slack Status Backlog Priority Medium Medium Assignee Unassigned Unassigned As of today at 10:46 AM Refresh Open in Jira ✨ Summarise
Automated report - sentry
Bug JY-20776 in Jira Cloud
Preview in Slack
Status
Backlog
Priority
Medium
Assignee
Unassigned
As of today at 10:46 AM
Refresh
Open in Jira
✨ Summarise
Open in browser
Share Bug JY-20776
View conversations
More actions
Today at 10:47:00 AM
10:47
проблем беше че няма pdf_url сега ще се разровя за конкретен репорт
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 10:47:35 AM
10:47
и идеята е на PHP да не го пробваме през час но Галя попита за регенериране
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 10:48:20 AM
10:48
предполагам че е нещо случайно най-вероятно само един репорт
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 10:50:30 AM
10:50
за бъдеще може да в самия пропхет има ли проверка дали има всичко преди да върне response, или пак от PHP да се провери преди пращане и да се пусне отново
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Steliyan Georgiev
Today at 10:51:18 AM
10:51 AM
може да направя профет ако няма pdf_url, да връща грешка за пхп?
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 10:51:50 AM...
|
[{"role":"AXPopUpButton","text [{"role":"AXPopUpButton","text":"Switch workspaces… (Jiminny Inc) Has new messages","depth":14,"bounds":{"left":0.51180553,"top":0.08111111,"width":0.025,"height":0.04},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Home","depth":14,"bounds":{"left":0.50625,"top":0.14,"width":0.036111113,"height":0.075555556},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Home","depth":16,"bounds":{"left":0.5138889,"top":0.19222222,"width":0.020833334,"height":0.015555556},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"DMs","depth":14,"bounds":{"left":0.50625,"top":0.21555555,"width":0.036111113,"height":0.075555556},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DMs","depth":16,"bounds":{"left":0.5159722,"top":0.26777777,"width":0.016666668,"height":0.015555556},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Activity","depth":14,"bounds":{"left":0.50625,"top":0.2911111,"width":0.036111113,"height":0.075555556},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Activity","depth":16,"bounds":{"left":0.51111114,"top":0.34333333,"width":0.027083334,"height":0.015555556},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.51111114,"top":0.34333333,"width":0.0055555557,"height":0.015555556}},{"char_start":1,"char_count":7,"bounds":{"left":0.5159722,"top":0.34333333,"width":0.022222223,"height":0.015555556}}],"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":14,"bounds":{"left":0.50625,"top":0.36666667,"width":0.036111113,"height":0.075555556},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":16,"bounds":{"left":0.51666665,"top":0.4188889,"width":0.015972223,"height":0.015555556},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.51666665,"top":0.4188889,"width":0.004166667,"height":0.015555556}},{"char_start":1,"char_count":4,"bounds":{"left":0.5208333,"top":0.4188889,"width":0.011805556,"height":0.015555556}}],"role_description":"text"},{"role":"AXRadioButton","text":"Later","depth":14,"bounds":{"left":0.50625,"top":0.4422222,"width":0.036111113,"height":0.075555556},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Later","depth":16,"bounds":{"left":0.5152778,"top":0.49444443,"width":0.018055556,"height":0.015555556},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"More…","depth":14,"bounds":{"left":0.50625,"top":0.5177778,"width":0.036111113,"height":0.075555556},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More","depth":16,"bounds":{"left":0.5152778,"top":0.57,"width":0.01875,"height":0.015555556},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Unreads","depth":21,"bounds":{"left":0.57708335,"top":0.12777779,"width":0.038194444,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Threads","depth":21,"bounds":{"left":0.57708335,"top":0.12777779,"width":0.036805555,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Huddles","depth":21,"bounds":{"left":0.57708335,"top":0.12777779,"width":0.038194444,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Drafts & sent","depth":21,"bounds":{"left":0.57708335,"top":0.12777779,"width":0.06111111,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":21,"bounds":{"left":0.68472224,"top":0.12777779,"width":0.0055555557,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Directories","depth":21,"bounds":{"left":0.57708335,"top":0.12777779,"width":0.050694443,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"jiminny-x-integration-app","depth":23,"bounds":{"left":0.58819443,"top":0.12777779,"width":0.09166667,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"platform-inner-team","depth":23,"bounds":{"left":0.58819443,"top":0.12777779,"width":0.093055554,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ai-chapter","depth":23,"bounds":{"left":0.58819443,"top":0.20111111,"width":0.046527777,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"alerts","depth":23,"bounds":{"left":0.58819443,"top":0.23222223,"width":0.025694445,"height":0.02},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.58819443,"top":0.23222223,"width":0.0055555557,"height":0.02}},{"char_start":1,"char_count":5,"bounds":{"left":0.59375,"top":0.23222223,"width":0.019444445,"height":0.02}}],"role_description":"text"},{"role":"AXStaticText","text":"backend","depth":23,"bounds":{"left":0.58819443,"top":0.26333332,"width":0.038194444,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"bugs","depth":23,"bounds":{"left":0.58819443,"top":0.29444444,"width":0.022222223,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"confusion-clinic","depth":23,"bounds":{"left":0.58819443,"top":0.32555556,"width":0.072222225,"height":0.02},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.58819443,"top":0.32555556,"width":0.0048611113,"height":0.02}},{"char_start":1,"char_count":15,"bounds":{"left":0.59305555,"top":0.32555556,"width":0.06736111,"height":0.02}}],"role_description":"text"},{"role":"AXStaticText","text":"curiosity_lab","depth":23,"bounds":{"left":0.58819443,"top":0.35666665,"width":0.057638887,"height":0.02},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.58819443,"top":0.35666665,"width":0.0048611113,"height":0.02}},{"char_start":1,"char_count":12,"bounds":{"left":0.59305555,"top":0.35666665,"width":0.05277778,"height":0.02}}],"role_description":"text"},{"role":"AXStaticText","text":"engineering","depth":23,"bounds":{"left":0.58819443,"top":0.38777778,"width":0.054166667,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"general","depth":23,"bounds":{"left":0.58819443,"top":0.4188889,"width":0.034027778,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"jiminny-bg","depth":23,"bounds":{"left":0.58819443,"top":0.45,"width":0.048611112,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"platform-tickets","depth":23,"bounds":{"left":0.58819443,"top":0.4811111,"width":0.072916664,"height":0.02},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.58819443,"top":0.4811111,"width":0.00625,"height":0.02}},{"char_start":1,"char_count":15,"bounds":{"left":0.59444445,"top":0.4811111,"width":0.06666667,"height":0.02}}],"role_description":"text"},{"role":"AXStaticText","text":"product_launches","depth":23,"bounds":{"left":0.58819443,"top":0.51222223,"width":0.08055556,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"random","depth":23,"bounds":{"left":0.58819443,"top":0.54333335,"width":0.035416666,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"releases","depth":23,"bounds":{"left":0.58819443,"top":0.5744445,"width":0.036805555,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"sofia-office","depth":23,"bounds":{"left":0.58819443,"top":0.60555553,"width":0.05138889,"height":0.02},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.58819443,"top":0.60555553,"width":0.0048611113,"height":0.02}},{"char_start":1,"char_count":11,"bounds":{"left":0.59305555,"top":0.60555553,"width":0.045833334,"height":0.02}}],"role_description":"text"},{"role":"AXStaticText","text":"support","depth":23,"bounds":{"left":0.58819443,"top":0.63666666,"width":0.036111113,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"thank-yous","depth":23,"bounds":{"left":0.58819443,"top":0.6677778,"width":0.05138889,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"the_people_of_jiminny","depth":23,"bounds":{"left":0.58819443,"top":0.6988889,"width":0.094444446,"height":0.02},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.58819443,"top":0.6988889,"width":0.004166667,"height":0.02}},{"char_start":1,"char_count":20,"bounds":{"left":0.5923611,"top":0.6988889,"width":0.09861111,"height":0.02}}],"role_description":"text"},{"role":"AXStaticText","text":"Petko Kashinski","depth":23,"bounds":{"left":0.58819443,"top":0.7722222,"width":0.072222225,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":23,"bounds":{"left":0.58819443,"top":0.80333334,"width":0.07986111,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Galya Dimitrova","depth":23,"bounds":{"left":0.58819443,"top":0.83444446,"width":0.07361111,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"bounds":{"left":0.58819443,"top":0.8655556,"width":0.07847222,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Stefka Stoyanova","depth":23,"bounds":{"left":0.58819443,"top":0.89666665,"width":0.079166666,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Vasil Vasilev","depth":23,"bounds":{"left":0.58819443,"top":0.92777777,"width":0.055555556,"height":0.02},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.58819443,"top":0.92777777,"width":0.00625,"height":0.02}},{"char_start":1,"char_count":12,"bounds":{"left":0.59444445,"top":0.92777777,"width":0.048611112,"height":0.02}}],"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Ivanov","depth":23,"bounds":{"left":0.58819443,"top":0.9588889,"width":0.06736111,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"bounds":{"left":0.58819443,"top":0.99,"width":0.07847222,"height":0.0044444446},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"bounds":{"left":0.6666667,"top":0.99,"width":0.013194445,"height":0.0044444446},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Yankov","depth":23,"bounds":{"left":0.6715278,"top":0.99,"width":0.029861111,"height":0.0044444446},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Stoyan Tanev","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Lukas Kovalik","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"you","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Jira Cloud","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Toast","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Google Calendar","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXRadioButton","text":"Messages","depth":17,"bounds":{"left":0.71319443,"top":0.12777779,"width":0.06458333,"height":0.04222222},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Messages","depth":19,"bounds":{"left":0.7326389,"top":0.14,"width":0.039583333,"height":0.017777778},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Add canvas","depth":18,"bounds":{"left":0.7798611,"top":0.12777779,"width":0.07152778,"height":0.04222222},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Add canvas","depth":20,"bounds":{"left":0.79930556,"top":0.14,"width":0.046527777,"height":0.017777778},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":17,"bounds":{"left":0.85347223,"top":0.12777779,"width":0.04375,"height":0.04222222},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":19,"bounds":{"left":0.87291664,"top":0.14,"width":0.01875,"height":0.017777778},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.87291664,"top":0.14,"width":0.0055555557,"height":0.017777778}},{"char_start":1,"char_count":4,"bounds":{"left":0.8784722,"top":0.14,"width":0.013194445,"height":0.017777778}}],"role_description":"text"},{"role":"AXPopUpButton","text":"Add and Edit Channel Tabs","depth":17,"bounds":{"left":0.9,"top":0.12777779,"width":0.022222223,"height":0.04222222},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Canvas","depth":17,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"List","depth":17,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":17,"on_screen":false,"role_description":"text"},{"role":"AXPopUpButton","text":"Jump to date","depth":22,"bounds":{"left":0.8229167,"top":0.17666666,"width":0.05277778,"height":0.031111112},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":23,"bounds":{"left":0.7465278,"top":0.16111112,"width":0.06458333,"height":0.0011111111},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.8111111,"top":0.16111112,"width":0.0055555557,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 10:40:03 AM","depth":23,"bounds":{"left":0.81666666,"top":0.16111112,"width":0.036805555,"height":0.0011111111},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10:40 AM","depth":24,"bounds":{"left":0.81666666,"top":0.16111112,"width":0.036805555,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"здрасти Стели","depth":24,"bounds":{"left":0.7465278,"top":0.16111112,"width":0.07083333,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 10:40:36 AM","depth":24,"bounds":{"left":0.71944445,"top":0.16111112,"width":0.021527778,"height":0.0011111111},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10:40","depth":25,"bounds":{"left":0.71944445,"top":0.16111112,"width":0.021527778,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Галя ме помоли да видим това със липсващ pdf_url на репорти","depth":24,"bounds":{"left":0.7465278,"top":0.16111112,"width":0.21180555,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 10:41:14 AM","depth":24,"bounds":{"left":0.71944445,"top":0.16111112,"width":0.021527778,"height":0.0011111111},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10:41","depth":25,"bounds":{"left":0.71944445,"top":0.16111112,"width":0.021527778,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"може ли по-късно да се чуем да видим какво може да направим","depth":24,"bounds":{"left":0.7465278,"top":0.16111112,"width":0.21944444,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Steliyan Georgiev","depth":23,"bounds":{"left":0.7465278,"top":0.16111112,"width":0.08263889,"height":0.0011111111},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.82916665,"top":0.16111112,"width":0.0055555557,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 10:44:58 AM","depth":23,"bounds":{"left":0.83402777,"top":0.16111112,"width":0.0375,"height":0.0011111111},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10:44 AM","depth":24,"bounds":{"left":0.83402777,"top":0.16111112,"width":0.0375,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Здрасти Лукаш, да","depth":24,"bounds":{"left":0.7465278,"top":0.16111112,"width":0.09097222,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"има ли тикет?","depth":24,"bounds":{"left":0.7465278,"top":0.16111112,"width":0.068055555,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Lukas Kovalik","depth":23,"bounds":{"left":0.7465278,"top":0.16111112,"width":0.06458333,"height":0.0011111111},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.8111111,"top":0.16111112,"width":0.0055555557,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 10:46:01 AM","depth":23,"bounds":{"left":0.81666666,"top":0.16111112,"width":0.036805555,"height":0.0011111111},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10:46 AM","depth":24,"bounds":{"left":0.81666666,"top":0.16111112,"width":0.036805555,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"https://jiminny.atlassian.net/browse/JY-20776","depth":24,"bounds":{"left":0.7465278,"top":0.16111112,"width":0.21111111,"height":0.0011111111},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"https://jiminny.atlassian.net/browse/JY-20776","depth":25,"bounds":{"left":0.7465278,"top":0.16111112,"width":0.21111111,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Jira Cloud","depth":23,"bounds":{"left":0.7465278,"top":0.16111112,"width":0.039583333,"height":0.0011111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Jira Cloud","depth":23,"bounds":{"left":0.7888889,"top":0.16111112,"width":0.011111111,"height":0.0011111111},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXButton","text":"Remove preview","depth":25,"bounds":{"left":0.7326389,"top":0.16111112,"width":0.013888889,"height":0.02111111},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Jira Cloud Bug JY-20776 Automated report - sentry Bug JY-20776 in Jira Cloud Preview in Slack Status Backlog Priority Medium Medium Assignee Unassigned Unassigned As of today at 10:46 AM Refresh Open in Jira ✨ Summarise","depth":25,"bounds":{"left":0.7465278,"top":0.16111112,"width":0.2361111,"height":0.2711111},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Automated report - sentry","depth":26,"bounds":{"left":0.7888889,"top":0.17444444,"width":0.12222222,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Bug JY-20776 in Jira Cloud","depth":27,"bounds":{"left":0.7888889,"top":0.19666667,"width":0.108333334,"height":0.017777778},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Preview in Slack","depth":27,"bounds":{"left":0.7888889,"top":0.19666667,"width":0.06527778,"height":0.017777778},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Status","depth":26,"bounds":{"left":0.7888889,"top":0.22888888,"width":0.025,"height":0.017777778},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Backlog","depth":26,"bounds":{"left":0.7916667,"top":0.25555557,"width":0.036111113,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Priority","depth":26,"bounds":{"left":0.8472222,"top":0.22888888,"width":0.029166667,"height":0.017777778},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.8472222,"top":0.22888888,"width":0.0055555557,"height":0.017777778}},{"char_start":1,"char_count":7,"bounds":{"left":0.8520833,"top":0.22888888,"width":0.024305556,"height":0.017777778}}],"role_description":"text"},{"role":"AXStaticText","text":"Medium","depth":26,"bounds":{"left":0.86388886,"top":0.25555557,"width":0.0375,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Assignee","depth":26,"bounds":{"left":0.7888889,"top":0.29666665,"width":0.035416666,"height":0.017777778},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Unassigned","depth":26,"bounds":{"left":0.8055556,"top":0.32333332,"width":0.05277778,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"As of today at 10:46 AM","depth":27,"bounds":{"left":0.75555557,"top":0.36888888,"width":0.097222224,"height":0.017777778},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Refresh","depth":27,"bounds":{"left":0.85486114,"top":0.37333333,"width":0.030555556,"height":0.008888889},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Jira","depth":27,"bounds":{"left":0.75555557,"top":0.3911111,"width":0.06458333,"height":0.031111112},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"✨ Summarise","depth":27,"bounds":{"left":0.8229167,"top":0.3911111,"width":0.07361111,"height":0.031111112},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Open in browser","depth":27,"bounds":{"left":0.8819444,"top":0.17444444,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Share Bug JY-20776","depth":26,"bounds":{"left":0.90416664,"top":0.17444444,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View conversations","depth":26,"bounds":{"left":0.92638886,"top":0.17444444,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More actions","depth":26,"bounds":{"left":0.94861114,"top":0.17444444,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 10:47:00 AM","depth":24,"bounds":{"left":0.71944445,"top":0.4511111,"width":0.021527778,"height":0.016666668},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10:47","depth":25,"bounds":{"left":0.71944445,"top":0.4511111,"width":0.021527778,"height":0.016666668},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"проблем беше че няма pdf_url сега ще се разровя за конкретен репорт","depth":24,"bounds":{"left":0.7465278,"top":0.44777778,"width":0.19861111,"height":0.044444446},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.7465278,"top":0.44777778,"width":0.00625,"height":0.02}},{"char_start":1,"char_count":66,"bounds":{"left":0.7465278,"top":0.44777778,"width":0.19791667,"height":0.044444446}}],"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":25,"bounds":{"left":0.8048611,"top":0.41333333,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":25,"bounds":{"left":0.82708335,"top":0.41333333,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":25,"bounds":{"left":0.84930557,"top":0.41333333,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":25,"bounds":{"left":0.8715278,"top":0.41333333,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":25,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":25,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":25,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":25,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 10:47:35 AM","depth":24,"bounds":{"left":0.71944445,"top":0.5088889,"width":0.021527778,"height":0.016666668},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10:47","depth":25,"bounds":{"left":0.71944445,"top":0.5088889,"width":0.021527778,"height":0.016666668},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"и идеята е на PHP да не го пробваме през час но Галя попита за регенериране","depth":24,"bounds":{"left":0.7465278,"top":0.50555557,"width":0.23472223,"height":0.044444446},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.7465278,"top":0.50555557,"width":0.00625,"height":0.02}},{"char_start":1,"char_count":74,"bounds":{"left":0.7465278,"top":0.50555557,"width":0.23472223,"height":0.044444446}}],"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":25,"bounds":{"left":0.8048611,"top":0.47111112,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":25,"bounds":{"left":0.82708335,"top":0.47111112,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":25,"bounds":{"left":0.84930557,"top":0.47111112,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":25,"bounds":{"left":0.8715278,"top":0.47111112,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":25,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":25,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":25,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":25,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 10:48:20 AM","depth":24,"bounds":{"left":0.71944445,"top":0.56666666,"width":0.021527778,"height":0.016666668},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10:48","depth":25,"bounds":{"left":0.71944445,"top":0.56666666,"width":0.021527778,"height":0.016666668},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"предполагам че е нещо случайно най-вероятно само един репорт","depth":24,"bounds":{"left":0.7465278,"top":0.56333333,"width":0.22986111,"height":0.044444446},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.7465278,"top":0.56333333,"width":0.00625,"height":0.02}},{"char_start":1,"char_count":59,"bounds":{"left":0.7465278,"top":0.56333333,"width":0.22916667,"height":0.044444446}}],"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":25,"bounds":{"left":0.8048611,"top":0.5288889,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":25,"bounds":{"left":0.82708335,"top":0.5288889,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":25,"bounds":{"left":0.84930557,"top":0.5288889,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":25,"bounds":{"left":0.8715278,"top":0.5288889,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":25,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":25,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":25,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":25,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 10:50:30 AM","depth":24,"bounds":{"left":0.71944445,"top":0.6244444,"width":0.021527778,"height":0.016666668},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10:50","depth":25,"bounds":{"left":0.71944445,"top":0.6244444,"width":0.021527778,"height":0.016666668},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"за бъдеще може да в самия пропхет има ли проверка дали има всичко преди да върне response, или пак от PHP да се провери преди пращане и да се пусне отново","depth":24,"bounds":{"left":0.7465278,"top":0.6211111,"width":0.22222222,"height":0.093333334},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.7465278,"top":0.6211111,"width":0.0048611113,"height":0.02}},{"char_start":1,"char_count":153,"bounds":{"left":0.7465278,"top":0.6211111,"width":0.22222222,"height":0.093333334}}],"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":25,"bounds":{"left":0.8048611,"top":0.58666664,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":25,"bounds":{"left":0.82708335,"top":0.58666664,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":25,"bounds":{"left":0.84930557,"top":0.58666664,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":25,"bounds":{"left":0.8715278,"top":0.58666664,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":25,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":25,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":25,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":25,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Steliyan Georgiev","depth":23,"bounds":{"left":0.7465278,"top":0.72555554,"width":0.08263889,"height":0.024444444},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.82916665,"top":0.7277778,"width":0.0055555557,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 10:51:18 AM","depth":23,"bounds":{"left":0.83402777,"top":0.7311111,"width":0.0375,"height":0.016666668},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10:51 AM","depth":24,"bounds":{"left":0.83402777,"top":0.7311111,"width":0.0375,"height":0.016666668},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"може да направя профет ако няма pdf_url, да връща грешка за пхп?","depth":24,"bounds":{"left":0.7465278,"top":0.75222224,"width":0.21666667,"height":0.044444446},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.7465278,"top":0.75222224,"width":0.007638889,"height":0.02}},{"char_start":1,"char_count":63,"bounds":{"left":0.7465278,"top":0.75222224,"width":0.21666667,"height":0.044444446}}],"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":25,"bounds":{"left":0.8048611,"top":0.70666665,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":25,"bounds":{"left":0.82708335,"top":0.70666665,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":25,"bounds":{"left":0.84930557,"top":0.70666665,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":25,"bounds":{"left":0.8715278,"top":0.70666665,"width":0.022222223,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":25,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":25,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":25,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":25,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":23,"bounds":{"left":0.7465278,"top":0.80777776,"width":0.06458333,"height":0.024444444},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":23,"bounds":{"left":0.8111111,"top":0.81,"width":0.0055555557,"height":0.02},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 10:51:50 AM","depth":23,"bounds":{"left":0.81666666,"top":0.81333333,"width":0.036805555,"height":0.016666668},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8005720881765573412
|
-5969075220703459238
|
idle
|
hybrid
|
NULL
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Petko Kashinski
Steliyan Georgiev
Galya Dimitrova
Aneliya Angelova
Stefka Stoyanova
Vasil Vasilev
Nikolay Ivanov
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Lukas Kovalik
you
Jira Cloud
Toast
Google Calendar
Messages
Messages
Add canvas
Add canvas
Files
Files
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Lukas Kovalik
Today at 10:40:03 AM
10:40 AM
здрасти Стели
Today at 10:40:36 AM
10:40
Галя ме помоли да видим това със липсващ pdf_url на репорти
Today at 10:41:14 AM
10:41
може ли по-късно да се чуем да видим какво може да направим
Steliyan Georgiev
Today at 10:44:58 AM
10:44 AM
Здрасти Лукаш, да
има ли тикет?
Lukas Kovalik
Today at 10:46:01 AM
10:46 AM
https://jiminny.atlassian.net/browse/JY-20776
https://jiminny.atlassian.net/browse/JY-20776
Jira Cloud
Jira Cloud
Remove preview
Jira Cloud Bug JY-20776 Automated report - sentry Bug JY-20776 in Jira Cloud Preview in Slack Status Backlog Priority Medium Medium Assignee Unassigned Unassigned As of today at 10:46 AM Refresh Open in Jira ✨ Summarise
Automated report - sentry
Bug JY-20776 in Jira Cloud
Preview in Slack
Status
Backlog
Priority
Medium
Assignee
Unassigned
As of today at 10:46 AM
Refresh
Open in Jira
✨ Summarise
Open in browser
Share Bug JY-20776
View conversations
More actions
Today at 10:47:00 AM
10:47
проблем беше че няма pdf_url сега ще се разровя за конкретен репорт
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 10:47:35 AM
10:47
и идеята е на PHP да не го пробваме през час но Галя попита за регенериране
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 10:48:20 AM
10:48
предполагам че е нещо случайно най-вероятно само един репорт
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 10:50:30 AM
10:50
за бъдеще може да в самия пропхет има ли проверка дали има всичко преди да върне response, или пак от PHP да се провери преди пращане и да се пусне отново
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Steliyan Georgiev
Today at 10:51:18 AM
10:51 AM
може да направя профет ако няма pdf_url, да връща грешка за пхп?
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 10:51:50 AM
=+SlackFileEditViewGoHistoryWindowHelpws.planhat.com/jiminny/home/data-explorer/usageJiminny vSearch JiminnyContent Explorer7 Metric |Datasetautomated-reports-traEnd UserData ExplorerQ autactivities.automated-reports-CalendarNameNotificationsOverviewRaw DataTral*• Morev EndUser 1Metricsautomated-reports-track-Sections +CS Day-to-day2 Getting started GuideJust CS Data* Daily Operations05 May06 May07• Weekly prep© Renewals and Upsell:= € Risk and Churn An...Implementation -Impl ProjectsTrial Opps (Under Rev...Stoyan's clientsCommentsAdd a commentHomeDMsActivityFilesLater..•MoreablSupport Daily - in 3h 42 m100% (8•Tue 12 May 11:18:29•→QDescribe what you are looking forJiminny ...Steliyan Georgiev6 0& platform-inner-team• Messagest Add canvasO Files+ChannelsAutomaTodayPreview in wawn# ai-chapter# alerts# backend# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bgStatusBacklogPriority= MediumAssigneeUnassignedAs of today at 10:46 AM RefreshOpen in JiraSummariseпроблем беше че няма pdf_url сега ще секонкретен репортMore28Toolsна РНР да не го пробваме през час ноа за регенериранеCreate and find workflows and appsам че е нещо случайно най-вероятнорепортCustomize navigation bar,2 може да в самия пропхет има ли# support# thank-yous# the_people_of jimi..проверка дали има всичко преди да върнеresponse, или пак от РНР да се провери предипращане и да се пусне отновоSteliyan Georgiev 10:51 AM0 Direct messagesможе да направя профет ако няма pdf_url, даPetko Kashinskiврьща грешка за пхп?R. Steliyan Georgiev%. Galya DimitrovaLukas Kovalik 10:51 AMпо-скоро да се регенерира8. Aneliya Angelova&. Stefka StoyanovaMessage Steliyan Georgiev€. Vasil Vasilev+..•. Nikolay Ivanov...
|
23621
|
NULL
|
NULL
|
NULL
|
|
899
|
31
|
18
|
2026-05-07T07:41:00.637602+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778139660637_m1.jpg...
|
Claude
|
Claude
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Skip to content
Skip to content
Click to collapse
Skip to content
Skip to content
Click to collapse
⌘B
Drag to resize
Open sidebar
Chat
Cowork
Code
New chat ⌘N
New chat
⌘N
Projects
Artifacts
Customize
Pinned
Bulgarian citizenship application process for EU residents
More options for Bulgarian citizenship application process for EU residents
Dawarich location tracking project
More options for Dawarich location tracking project
Recents
View all
Screenpipe retention policy code location
More options for Screenpipe retention policy code location
Viewing retention policy in screenpipe
More options for Viewing retention policy in screenpipe
Clean shot x video recording termination issue
More options for Clean shot x video recording termination issue
HubSpot rate limit handling with executeRequest
More options for HubSpot rate limit handling with executeRequest
Untitled
More options
💬 Screen pipe. Is there ability…
More options for 💬 Screen pipe. Is there ability…
SMB mount access inconsistency between Finder and iTerm
More options for SMB mount access inconsistency between Finder and iTerm
💬 What is the best switch I can…
More options for 💬 What is the best switch I can…
Permission denied on screenpipe volume
More options for Permission denied on screenpipe volume
Screenpipe sync database attachment error
More options for Screenpipe sync database attachment error
Last swimming outing with Dani
More options for Last swimming outing with Dani
Definition of incarcerated
More options for Definition of incarcerated
Chromecast remote volume buttons not working
More options for Chromecast remote volume buttons not working
Salesforce API errors with Organization and FieldDefinition queries
More options for Salesforce API errors with Organization and FieldDefinition queries
Daily activity summary from screenpipe data
More options for Daily activity summary from screenpipe data
MacBook unexpected restarts and kanji screen
More options for MacBook unexpected restarts and kanji screen
Security patch review and testing guidance
More options for Security patch review and testing guidance
Food calorie values reference
More options for Food calorie values reference
Tracking location history from last week
More options for Tracking location history from last week
Screenpipe WAL processing when stopped
More options for Screenpipe WAL processing when stopped
Lukas Pro
Get apps and extensions
Coffee and Claude time?
So just a solution for rate limit implementation. The situation currently is that there are some daily and secondary limits for HubSpot. I would like to make sure I never reach a 429 error rate limit. The requests can come from any flow. It can be:
• updating activity
• searching for a company or contact
• updating deal
• patching IDs
Review what the limit is at the moment in the HubSpot documentation and then think of the solution:
• where to store it
• how to read it
• how to work with multiple jobs
• how to work with paginated requests
Let's consider a situation when there are 600 opportunities to sync. What would be the flow? How would the rate limit be recognized? How would it be handled? What are the potential issues?
So just a solution for rate limit implementation. The situation currently is that there are some daily and secondary limits for HubSpot. I would like to make sure I never reach a 429 error rate limit. The requests can come from any flow. It can be:
updating activity
searching for a company or contact
updating deal
patching IDs
Review what the limit is at the moment in the HubSpot documentation and then think of the solution:
where to store it
how to read it
how to work with multiple jobs
how to work with paginated requests
Let's consider a situation when there are 600 opportunities to sync. What would be the flow? How would the rate limit be recognized? How would it be handled? What are the potential issues?
Add files, connectors, and more
Model: Sonnet 4.6
Sonnet 4.6
Send message
Use incognito...
|
[{"role":"AXLink","text":& [{"role":"AXLink","text":"Skip to content","depth":14,"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Skip to content","depth":15,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Click to collapse","depth":16,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"⌘B","depth":16,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Drag to resize","depth":16,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Open sidebar","depth":14,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chat","depth":16,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cowork","depth":16,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code","depth":16,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New chat ⌘N","depth":15,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"New chat","depth":16,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"⌘N","depth":17,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Projects","depth":15,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Artifacts","depth":15,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Customize","depth":15,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Pinned","depth":16,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXButton","text":"Bulgarian citizenship application process for EU residents","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Bulgarian citizenship application process for EU residents","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Dawarich location tracking project","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Dawarich location tracking project","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Recents","depth":16,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXButton","text":"View all","depth":16,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screenpipe retention policy code location","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Screenpipe retention policy code location","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Viewing retention policy in screenpipe","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Viewing retention policy in screenpipe","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Clean shot x video recording termination issue","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Clean shot x video recording termination issue","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HubSpot rate limit handling with executeRequest","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for HubSpot rate limit handling with executeRequest","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Untitled","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"💬 Screen pipe. Is there ability…","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for 💬 Screen pipe. Is there ability…","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"SMB mount access inconsistency between Finder and iTerm","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for SMB mount access inconsistency between Finder and iTerm","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"💬 What is the best switch I can…","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for 💬 What is the best switch I can…","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Permission denied on screenpipe volume","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Permission denied on screenpipe volume","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screenpipe sync database attachment error","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Screenpipe sync database attachment error","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Last swimming outing with Dani","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Last swimming outing with Dani","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Definition of incarcerated","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Definition of incarcerated","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chromecast remote volume buttons not working","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Chromecast remote volume buttons not working","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Salesforce API errors with Organization and FieldDefinition queries","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Salesforce API errors with Organization and FieldDefinition queries","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Daily activity summary from screenpipe data","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Daily activity summary from screenpipe data","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"MacBook unexpected restarts and kanji screen","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for MacBook unexpected restarts and kanji screen","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Security patch review and testing guidance","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Security patch review and testing guidance","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Food calorie values reference","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Food calorie values reference","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tracking location history from last week","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Tracking location history from last week","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screenpipe WAL processing when stopped","depth":18,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Screenpipe WAL processing when stopped","depth":19,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"Lukas Pro","depth":15,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Get apps and extensions","depth":15,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Coffee and Claude time?","depth":18,"on_screen":true,"role_description":"text"},{"role":"AXTextArea","text":"So just a solution for rate limit implementation. The situation currently is that there are some daily and secondary limits for HubSpot. I would like to make sure I never reach a 429 error rate limit. The requests can come from any flow. It can be:\n• updating activity\n• searching for a company or contact\n• updating deal\n• patching IDs \nReview what the limit is at the moment in the HubSpot documentation and then think of the solution:\n• where to store it\n• how to read it\n• how to work with multiple jobs\n• how to work with paginated requests \nLet's consider a situation when there are 600 opportunities to sync. What would be the flow? How would the rate limit be recognized? How would it be handled? What are the potential issues?","depth":22,"on_screen":true,"value":"So just a solution for rate limit implementation. The situation currently is that there are some daily and secondary limits for HubSpot. I would like to make sure I never reach a 429 error rate limit. The requests can come from any flow. It can be:\n• updating activity\n• searching for a company or contact\n• updating deal\n• patching IDs \nReview what the limit is at the moment in the HubSpot documentation and then think of the solution:\n• where to store it\n• how to read it\n• how to work with multiple jobs\n• how to work with paginated requests \nLet's consider a situation when there are 600 opportunities to sync. What would be the flow? How would the rate limit be recognized? How would it be handled? What are the potential issues?","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"So just a solution for rate limit implementation. The situation currently is that there are some daily and secondary limits for HubSpot. I would like to make sure I never reach a 429 error rate limit. The requests can come from any flow. It can be:","depth":24,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"updating activity","depth":26,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"searching for a company or contact","depth":26,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"updating deal","depth":26,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"patching IDs","depth":26,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Review what the limit is at the moment in the HubSpot documentation and then think of the solution:","depth":24,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"where to store it","depth":26,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"how to read it","depth":26,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"how to work with multiple jobs","depth":26,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"how to work with paginated requests","depth":26,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Let's consider a situation when there are 600 opportunities to sync. What would be the flow? How would the rate limit be recognized? How would it be handled? What are the potential issues?","depth":24,"on_screen":true,"role_description":"text"},{"role":"AXPopUpButton","text":"Add files, connectors, and more","depth":24,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"Model: Sonnet 4.6","depth":24,"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Sonnet 4.6","depth":26,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Send message","depth":23,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Use incognito","depth":19,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8004735973205357679
|
-3292590112776533860
|
click
|
accessibility
|
NULL
|
Skip to content
Skip to content
Click to collapse
Skip to content
Skip to content
Click to collapse
⌘B
Drag to resize
Open sidebar
Chat
Cowork
Code
New chat ⌘N
New chat
⌘N
Projects
Artifacts
Customize
Pinned
Bulgarian citizenship application process for EU residents
More options for Bulgarian citizenship application process for EU residents
Dawarich location tracking project
More options for Dawarich location tracking project
Recents
View all
Screenpipe retention policy code location
More options for Screenpipe retention policy code location
Viewing retention policy in screenpipe
More options for Viewing retention policy in screenpipe
Clean shot x video recording termination issue
More options for Clean shot x video recording termination issue
HubSpot rate limit handling with executeRequest
More options for HubSpot rate limit handling with executeRequest
Untitled
More options
💬 Screen pipe. Is there ability…
More options for 💬 Screen pipe. Is there ability…
SMB mount access inconsistency between Finder and iTerm
More options for SMB mount access inconsistency between Finder and iTerm
💬 What is the best switch I can…
More options for 💬 What is the best switch I can…
Permission denied on screenpipe volume
More options for Permission denied on screenpipe volume
Screenpipe sync database attachment error
More options for Screenpipe sync database attachment error
Last swimming outing with Dani
More options for Last swimming outing with Dani
Definition of incarcerated
More options for Definition of incarcerated
Chromecast remote volume buttons not working
More options for Chromecast remote volume buttons not working
Salesforce API errors with Organization and FieldDefinition queries
More options for Salesforce API errors with Organization and FieldDefinition queries
Daily activity summary from screenpipe data
More options for Daily activity summary from screenpipe data
MacBook unexpected restarts and kanji screen
More options for MacBook unexpected restarts and kanji screen
Security patch review and testing guidance
More options for Security patch review and testing guidance
Food calorie values reference
More options for Food calorie values reference
Tracking location history from last week
More options for Tracking location history from last week
Screenpipe WAL processing when stopped
More options for Screenpipe WAL processing when stopped
Lukas Pro
Get apps and extensions
Coffee and Claude time?
So just a solution for rate limit implementation. The situation currently is that there are some daily and secondary limits for HubSpot. I would like to make sure I never reach a 429 error rate limit. The requests can come from any flow. It can be:
• updating activity
• searching for a company or contact
• updating deal
• patching IDs
Review what the limit is at the moment in the HubSpot documentation and then think of the solution:
• where to store it
• how to read it
• how to work with multiple jobs
• how to work with paginated requests
Let's consider a situation when there are 600 opportunities to sync. What would be the flow? How would the rate limit be recognized? How would it be handled? What are the potential issues?
So just a solution for rate limit implementation. The situation currently is that there are some daily and secondary limits for HubSpot. I would like to make sure I never reach a 429 error rate limit. The requests can come from any flow. It can be:
updating activity
searching for a company or contact
updating deal
patching IDs
Review what the limit is at the moment in the HubSpot documentation and then think of the solution:
where to store it
how to read it
how to work with multiple jobs
how to work with paginated requests
Let's consider a situation when there are 600 opportunities to sync. What would be the flow? How would the rate limit be recognized? How would it be handled? What are the potential issues?
Add files, connectors, and more
Model: Sonnet 4.6
Sonnet 4.6
Send message
Use incognito...
|
897
|
NULL
|
NULL
|
NULL
|
|
900
|
32
|
24
|
2026-05-07T07:41:00.637604+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778139660637_m2.jpg...
|
Claude
|
Claude
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Skip to content
Skip to content
Click to collapse
Skip to content
Skip to content
Click to collapse
⌘B
Drag to resize
Open sidebar
Chat
Cowork
Code
New chat ⌘N
New chat
⌘N
Projects
Artifacts
Customize
Pinned
Bulgarian citizenship application process for EU residents
More options for Bulgarian citizenship application process for EU residents
Dawarich location tracking project
More options for Dawarich location tracking project
Recents
View all
Screenpipe retention policy code location
More options for Screenpipe retention policy code location
Viewing retention policy in screenpipe
More options for Viewing retention policy in screenpipe
Clean shot x video recording termination issue
More options for Clean shot x video recording termination issue
HubSpot rate limit handling with executeRequest
More options for HubSpot rate limit handling with executeRequest
Untitled
More options
💬 Screen pipe. Is there ability…
More options for 💬 Screen pipe. Is there ability…
SMB mount access inconsistency between Finder and iTerm
More options for SMB mount access inconsistency between Finder and iTerm
💬 What is the best switch I can…
More options for 💬 What is the best switch I can…
Permission denied on screenpipe volume
More options for Permission denied on screenpipe volume
Screenpipe sync database attachment error
More options for Screenpipe sync database attachment error
Last swimming outing with Dani
More options for Last swimming outing with Dani
Definition of incarcerated
More options for Definition of incarcerated
Chromecast remote volume buttons not working
More options for Chromecast remote volume buttons not working
Salesforce API errors with Organization and FieldDefinition queries
More options for Salesforce API errors with Organization and FieldDefinition queries
Daily activity summary from screenpipe data
More options for Daily activity summary from screenpipe data
MacBook unexpected restarts and kanji screen
More options for MacBook unexpected restarts and kanji screen
Security patch review and testing guidance
More options for Security patch review and testing guidance
Food calorie values reference
More options for Food calorie values reference
Tracking location history from last week
More options for Tracking location history from last week
Screenpipe WAL processing when stopped
More options for Screenpipe WAL processing when stopped
Lukas Pro
Get apps and extensions
Coffee and Claude time?
So just a solution for rate limit implementation. The situation currently is that there are some daily and secondary limits for HubSpot. I would like to make sure I never reach a 429 error rate limit. The requests can come from any flow. It can be:
• updating activity
• searching for a company or contact
• updating deal
• patching IDs
Review what the limit is at the moment in the HubSpot documentation and then think of the solution:
• where to store it
• how to read it
• how to work with multiple jobs
• how to work with paginated requests
Let's consider a situation when there are 600 opportunities to sync. What would be the flow? How would the rate limit be recognized? How would it be handled? What are the potential issues?
So just a solution for rate limit implementation. The situation currently is that there are some daily and secondary limits for HubSpot. I would like to make sure I never reach a 429 error rate limit. The requests can come from any flow. It can be:
updating activity
searching for a company or contact
updating deal
patching IDs
Review what the limit is at the moment in the HubSpot documentation and then think of the solution:
where to store it
how to read it
how to work with multiple jobs
how to work with paginated requests
Let's consider a situation when there are 600 opportunities to sync. What would be the flow? How would the rate limit be recognized? How would it be handled? What are the potential issues?
Add files, connectors, and more
Model: Sonnet 4.6
Sonnet 4.6
Send message
Use incognito...
|
[{"role":"AXLink","text":& [{"role":"AXLink","text":"Skip to content","depth":14,"bounds":{"left":0.029587766,"top":0.03830806,"width":0.0003324468,"height":0.0007980846},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Skip to content","depth":15,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Click to collapse","depth":16,"bounds":{"left":0.10239362,"top":0.06703911,"width":0.030585106,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.10239362,"top":0.06703911,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":16,"bounds":{"left":0.10538564,"top":0.06703911,"width":0.027925532,"height":0.011971269}}],"role_description":"text"},{"role":"AXStaticText","text":"⌘B","depth":16,"bounds":{"left":0.1349734,"top":0.06703911,"width":0.0063164895,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Drag to resize","depth":16,"bounds":{"left":0.10239362,"top":0.079010375,"width":0.025930852,"height":0.011971269},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.10239362,"top":0.079010375,"width":0.0029920214,"height":0.011971269}},{"char_start":1,"char_count":13,"bounds":{"left":0.10538564,"top":0.079010375,"width":0.022938829,"height":0.011971269}}],"role_description":"text"},{"role":"AXButton","text":"Open sidebar","depth":14,"bounds":{"left":0.029920213,"top":0.02793296,"width":0.00930851,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chat","depth":16,"bounds":{"left":0.004986702,"top":0.059856344,"width":0.025930852,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cowork","depth":16,"bounds":{"left":0.03158245,"top":0.059856344,"width":0.03125,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code","depth":16,"bounds":{"left":0.0631649,"top":0.059856344,"width":0.026928192,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New chat ⌘N","depth":15,"bounds":{"left":0.0043218085,"top":0.08938547,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"New chat","depth":16,"bounds":{"left":0.014295213,"top":0.0933759,"width":0.018949468,"height":0.012769354},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.014295213,"top":0.0933759,"width":0.003656915,"height":0.013567438}},{"char_start":1,"char_count":7,"bounds":{"left":0.01761968,"top":0.0933759,"width":0.015957447,"height":0.013567438}}],"role_description":"text"},{"role":"AXStaticText","text":"⌘N","depth":17,"bounds":{"left":0.08178192,"top":0.0933759,"width":0.006981383,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Projects","depth":15,"bounds":{"left":0.0043218085,"top":0.110135674,"width":0.08643617,"height":0.019952115},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Artifacts","depth":15,"bounds":{"left":0.0043218085,"top":0.1300878,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Customize","depth":15,"bounds":{"left":0.0043218085,"top":0.15003991,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Pinned","depth":16,"bounds":{"left":0.0063164895,"top":0.18914606,"width":0.08377659,"height":0.013567438},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXButton","text":"Bulgarian citizenship application process for EU residents","depth":18,"bounds":{"left":0.0043218085,"top":0.20590582,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Bulgarian citizenship application process for EU residents","depth":19,"bounds":{"left":0.08344415,"top":0.20909816,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Dawarich location tracking project","depth":18,"bounds":{"left":0.0043218085,"top":0.22745411,"width":0.08643617,"height":0.019952115},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Dawarich location tracking project","depth":19,"bounds":{"left":0.08344415,"top":0.22984837,"width":0.005984043,"height":0.015163607},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Recents","depth":16,"bounds":{"left":0.0063164895,"top":0.25698325,"width":0.06349734,"height":0.012769354},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXButton","text":"View all","depth":16,"bounds":{"left":0.07114362,"top":0.25698325,"width":0.018949468,"height":0.012769354},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screenpipe retention policy code location","depth":18,"bounds":{"left":0.0043218085,"top":0.27294493,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Screenpipe retention policy code location","depth":19,"bounds":{"left":0.08344415,"top":0.27613726,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Viewing retention policy in screenpipe","depth":18,"bounds":{"left":0.0043218085,"top":0.29449323,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Viewing retention policy in screenpipe","depth":19,"bounds":{"left":0.08344415,"top":0.29768556,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Clean shot x video recording termination issue","depth":18,"bounds":{"left":0.0043218085,"top":0.31524342,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Clean shot x video recording termination issue","depth":19,"bounds":{"left":0.08344415,"top":0.31843576,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HubSpot rate limit handling with executeRequest","depth":18,"bounds":{"left":0.0043218085,"top":0.3367917,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for HubSpot rate limit handling with executeRequest","depth":19,"bounds":{"left":0.08344415,"top":0.33998403,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Untitled","depth":18,"bounds":{"left":0.0043218085,"top":0.3575419,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options","depth":19,"bounds":{"left":0.08344415,"top":0.36073422,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"💬 Screen pipe. Is there ability…","depth":18,"bounds":{"left":0.0043218085,"top":0.3790902,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for 💬 Screen pipe. Is there ability…","depth":19,"bounds":{"left":0.08344415,"top":0.38228253,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"SMB mount access inconsistency between Finder and iTerm","depth":18,"bounds":{"left":0.0043218085,"top":0.39984038,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for SMB mount access inconsistency between Finder and iTerm","depth":19,"bounds":{"left":0.08344415,"top":0.40303272,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"💬 What is the best switch I can…","depth":18,"bounds":{"left":0.0043218085,"top":0.42138866,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for 💬 What is the best switch I can…","depth":19,"bounds":{"left":0.08344415,"top":0.4237829,"width":0.005984043,"height":0.015163607},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Permission denied on screenpipe volume","depth":18,"bounds":{"left":0.0043218085,"top":0.44213888,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Permission denied on screenpipe volume","depth":19,"bounds":{"left":0.08344415,"top":0.44533122,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screenpipe sync database attachment error","depth":18,"bounds":{"left":0.0043218085,"top":0.46288908,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Screenpipe sync database attachment error","depth":19,"bounds":{"left":0.08344415,"top":0.4660814,"width":0.005984043,"height":0.015163607},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Last swimming outing with Dani","depth":18,"bounds":{"left":0.0043218085,"top":0.48443735,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Last swimming outing with Dani","depth":19,"bounds":{"left":0.08344415,"top":0.48762968,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Definition of incarcerated","depth":18,"bounds":{"left":0.0043218085,"top":0.5051876,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Definition of incarcerated","depth":19,"bounds":{"left":0.08344415,"top":0.5083799,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chromecast remote volume buttons not working","depth":18,"bounds":{"left":0.0043218085,"top":0.52673584,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Chromecast remote volume buttons not working","depth":19,"bounds":{"left":0.08344415,"top":0.52992815,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Salesforce API errors with Organization and FieldDefinition queries","depth":18,"bounds":{"left":0.0043218085,"top":0.547486,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Salesforce API errors with Organization and FieldDefinition queries","depth":19,"bounds":{"left":0.08344415,"top":0.5506784,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Daily activity summary from screenpipe data","depth":18,"bounds":{"left":0.0043218085,"top":0.56903434,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Daily activity summary from screenpipe data","depth":19,"bounds":{"left":0.08344415,"top":0.57222664,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"MacBook unexpected restarts and kanji screen","depth":18,"bounds":{"left":0.0043218085,"top":0.5897845,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for MacBook unexpected restarts and kanji screen","depth":19,"bounds":{"left":0.08344415,"top":0.59297687,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Security patch review and testing guidance","depth":18,"bounds":{"left":0.0043218085,"top":0.6113328,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Security patch review and testing guidance","depth":19,"bounds":{"left":0.08344415,"top":0.61452514,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Food calorie values reference","depth":18,"bounds":{"left":0.0043218085,"top":0.632083,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Food calorie values reference","depth":19,"bounds":{"left":0.08344415,"top":0.63527536,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tracking location history from last week","depth":18,"bounds":{"left":0.0043218085,"top":0.65363127,"width":0.08643617,"height":0.0207502},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Tracking location history from last week","depth":19,"bounds":{"left":0.08344415,"top":0.65682364,"width":0.005984043,"height":0.014365523},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Screenpipe WAL processing when stopped","depth":18,"bounds":{"left":0.0043218085,"top":0.6743815,"width":0.08643617,"height":0.011173184},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More options for Screenpipe WAL processing when stopped","depth":19,"bounds":{"left":0.08344415,"top":0.6775738,"width":0.005984043,"height":0.007980846},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"Lukas Pro","depth":15,"bounds":{"left":0.0043218085,"top":0.6943336,"width":0.037898935,"height":0.01915403},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Get apps and extensions","depth":15,"bounds":{"left":0.08277926,"top":0.6943336,"width":0.007978723,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Coffee and Claude time?","depth":18,"bounds":{"left":0.18550532,"top":0.3056664,"width":0.1462766,"height":0.040702313},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.18583776,"top":0.3064645,"width":0.010305851,"height":0.03990423}},{"char_start":1,"char_count":22,"bounds":{"left":0.19614361,"top":0.3064645,"width":0.1356383,"height":0.03990423}}],"role_description":"text"},{"role":"AXTextArea","text":"So just a solution for rate limit implementation. The situation currently is that there are some daily and secondary limits for HubSpot. I would like to make sure I never reach a 429 error rate limit. The requests can come from any flow. It can be:\n• updating activity\n• searching for a company or contact\n• updating deal\n• patching IDs \nReview what the limit is at the moment in the HubSpot documentation and then think of the solution:\n• where to store it\n• how to read it\n• how to work with multiple jobs\n• how to work with paginated requests \nLet's consider a situation when there are 600 opportunities to sync. What would be the flow? How would the rate limit be recognized? How would it be handled? What are the potential issues?","depth":22,"bounds":{"left":0.14660904,"top":0.39185953,"width":0.21210106,"height":0.28651237},"on_screen":true,"value":"So just a solution for rate limit implementation. The situation currently is that there are some daily and secondary limits for HubSpot. I would like to make sure I never reach a 429 error rate limit. The requests can come from any flow. It can be:\n• updating activity\n• searching for a company or contact\n• updating deal\n• patching IDs \nReview what the limit is at the moment in the HubSpot documentation and then think of the solution:\n• where to store it\n• how to read it\n• how to work with multiple jobs\n• how to work with paginated requests \nLet's consider a situation when there are 600 opportunities to sync. What would be the flow? How would the rate limit be recognized? How would it be handled? What are the potential issues?","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"So just a solution for rate limit implementation. The situation currently is that there are some daily and secondary limits for HubSpot. I would like to make sure I never reach a 429 error rate limit. The requests can come from any flow. It can be:","depth":24,"bounds":{"left":0.14660904,"top":0.3926576,"width":0.20611702,"height":0.0518755},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.14660904,"top":0.3934557,"width":0.0033244682,"height":0.015961692}},{"char_start":1,"char_count":247,"bounds":{"left":0.14660904,"top":0.3934557,"width":0.20611702,"height":0.0518755}}],"role_description":"text"},{"role":"AXStaticText","text":"updating activity","depth":26,"bounds":{"left":0.15724733,"top":0.4461293,"width":0.042220745,"height":0.016759777},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.15724733,"top":0.44692737,"width":0.0033244682,"height":0.015961692}},{"char_start":1,"char_count":16,"bounds":{"left":0.16057181,"top":0.44692737,"width":0.039228722,"height":0.015961692}}],"role_description":"text"},{"role":"AXStaticText","text":"searching for a company or contact","depth":26,"bounds":{"left":0.15724733,"top":0.46448523,"width":0.087765954,"height":0.015961692},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.15724733,"top":0.46448523,"width":0.0026595744,"height":0.016759777}},{"char_start":1,"char_count":33,"bounds":{"left":0.15990691,"top":0.46448523,"width":0.08510638,"height":0.016759777}}],"role_description":"text"},{"role":"AXStaticText","text":"updating deal","depth":26,"bounds":{"left":0.15724733,"top":0.4820431,"width":0.033909574,"height":0.016759777},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.15724733,"top":0.4828412,"width":0.0033244682,"height":0.015961692}},{"char_start":1,"char_count":12,"bounds":{"left":0.16057181,"top":0.4828412,"width":0.030917553,"height":0.015961692}}],"role_description":"text"},{"role":"AXStaticText","text":"patching IDs","depth":26,"bounds":{"left":0.15724733,"top":0.49960095,"width":0.03125,"height":0.016759777},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.15724733,"top":0.50039905,"width":0.0033244682,"height":0.015961692}},{"char_start":1,"char_count":11,"bounds":{"left":0.16057181,"top":0.50039905,"width":0.027925532,"height":0.015961692}}],"role_description":"text"},{"role":"AXStaticText","text":"Review what the limit is at the moment in the HubSpot documentation and then think of the solution:","depth":24,"bounds":{"left":0.14660904,"top":0.5179569,"width":0.19980054,"height":0.03431764},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.14660904,"top":0.5179569,"width":0.0013297872,"height":0.016759777}},{"char_start":1,"char_count":98,"bounds":{"left":0.14660904,"top":0.5179569,"width":0.19980054,"height":0.03431764}}],"role_description":"text"},{"role":"AXStaticText","text":"where to store it","depth":26,"bounds":{"left":0.15724733,"top":0.55387074,"width":0.041223403,"height":0.015961692},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.15724733,"top":0.55387074,"width":0.0043218085,"height":0.016759777}},{"char_start":1,"char_count":16,"bounds":{"left":0.16156915,"top":0.55387074,"width":0.036901597,"height":0.016759777}}],"role_description":"text"},{"role":"AXStaticText","text":"how to read it","depth":26,"bounds":{"left":0.15724733,"top":0.5714286,"width":0.034242023,"height":0.016759777},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.15724733,"top":0.57222664,"width":0.0033244682,"height":0.015961692}},{"char_start":1,"char_count":13,"bounds":{"left":0.16057181,"top":0.57222664,"width":0.030917553,"height":0.015961692}}],"role_description":"text"},{"role":"AXStaticText","text":"how to work with multiple jobs","depth":26,"bounds":{"left":0.15724733,"top":0.58898646,"width":0.076130316,"height":0.016759777},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.15724733,"top":0.5897845,"width":0.0033244682,"height":0.015961692}},{"char_start":1,"char_count":29,"bounds":{"left":0.16057181,"top":0.5897845,"width":0.07280585,"height":0.015961692}}],"role_description":"text"},{"role":"AXStaticText","text":"how to work with paginated requests","depth":26,"bounds":{"left":0.15724733,"top":0.60734236,"width":0.09242021,"height":0.015961692},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.15724733,"top":0.60734236,"width":0.0033244682,"height":0.016759777}},{"char_start":1,"char_count":34,"bounds":{"left":0.16057181,"top":0.60734236,"width":0.08909574,"height":0.016759777}}],"role_description":"text"},{"role":"AXStaticText","text":"Let's consider a situation when there are 600 opportunities to sync. What would be the flow? How would the rate limit be recognized? How would it be handled? What are the potential issues?","depth":24,"bounds":{"left":0.14660904,"top":0.6249002,"width":0.2081117,"height":0.052673582},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.14660904,"top":0.6256983,"width":0.0013297872,"height":0.015961692}},{"char_start":1,"char_count":187,"bounds":{"left":0.14660904,"top":0.6256983,"width":0.2081117,"height":0.0518755}}],"role_description":"text"},{"role":"AXPopUpButton","text":"Add files, connectors, and more","depth":24,"bounds":{"left":0.14527926,"top":0.68715084,"width":0.010638298,"height":0.026336791},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"Model: Sonnet 4.6","depth":24,"bounds":{"left":0.31083778,"top":0.68715084,"width":0.034574468,"height":0.026336791},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Sonnet 4.6","depth":26,"bounds":{"left":0.31416222,"top":0.6927374,"width":0.023271276,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.31416222,"top":0.6935355,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":9,"bounds":{"left":0.3168218,"top":0.6935355,"width":0.020611702,"height":0.014365523}}],"role_description":"text"},{"role":"AXButton","text":"Send message","depth":23,"bounds":{"left":0.3480718,"top":0.68715084,"width":0.010638298,"height":0.026336791},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Use incognito","depth":19,"bounds":{"left":0.48537233,"top":0.02793296,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-8004735973205357679
|
-3292590112776533860
|
click
|
accessibility
|
NULL
|
Skip to content
Skip to content
Click to collapse
Skip to content
Skip to content
Click to collapse
⌘B
Drag to resize
Open sidebar
Chat
Cowork
Code
New chat ⌘N
New chat
⌘N
Projects
Artifacts
Customize
Pinned
Bulgarian citizenship application process for EU residents
More options for Bulgarian citizenship application process for EU residents
Dawarich location tracking project
More options for Dawarich location tracking project
Recents
View all
Screenpipe retention policy code location
More options for Screenpipe retention policy code location
Viewing retention policy in screenpipe
More options for Viewing retention policy in screenpipe
Clean shot x video recording termination issue
More options for Clean shot x video recording termination issue
HubSpot rate limit handling with executeRequest
More options for HubSpot rate limit handling with executeRequest
Untitled
More options
💬 Screen pipe. Is there ability…
More options for 💬 Screen pipe. Is there ability…
SMB mount access inconsistency between Finder and iTerm
More options for SMB mount access inconsistency between Finder and iTerm
💬 What is the best switch I can…
More options for 💬 What is the best switch I can…
Permission denied on screenpipe volume
More options for Permission denied on screenpipe volume
Screenpipe sync database attachment error
More options for Screenpipe sync database attachment error
Last swimming outing with Dani
More options for Last swimming outing with Dani
Definition of incarcerated
More options for Definition of incarcerated
Chromecast remote volume buttons not working
More options for Chromecast remote volume buttons not working
Salesforce API errors with Organization and FieldDefinition queries
More options for Salesforce API errors with Organization and FieldDefinition queries
Daily activity summary from screenpipe data
More options for Daily activity summary from screenpipe data
MacBook unexpected restarts and kanji screen
More options for MacBook unexpected restarts and kanji screen
Security patch review and testing guidance
More options for Security patch review and testing guidance
Food calorie values reference
More options for Food calorie values reference
Tracking location history from last week
More options for Tracking location history from last week
Screenpipe WAL processing when stopped
More options for Screenpipe WAL processing when stopped
Lukas Pro
Get apps and extensions
Coffee and Claude time?
So just a solution for rate limit implementation. The situation currently is that there are some daily and secondary limits for HubSpot. I would like to make sure I never reach a 429 error rate limit. The requests can come from any flow. It can be:
• updating activity
• searching for a company or contact
• updating deal
• patching IDs
Review what the limit is at the moment in the HubSpot documentation and then think of the solution:
• where to store it
• how to read it
• how to work with multiple jobs
• how to work with paginated requests
Let's consider a situation when there are 600 opportunities to sync. What would be the flow? How would the rate limit be recognized? How would it be handled? What are the potential issues?
So just a solution for rate limit implementation. The situation currently is that there are some daily and secondary limits for HubSpot. I would like to make sure I never reach a 429 error rate limit. The requests can come from any flow. It can be:
updating activity
searching for a company or contact
updating deal
patching IDs
Review what the limit is at the moment in the HubSpot documentation and then think of the solution:
where to store it
how to read it
how to work with multiple jobs
how to work with paginated requests
Let's consider a situation when there are 600 opportunities to sync. What would be the flow? How would the rate limit be recognized? How would it be handled? What are the potential issues?
Add files, connectors, and more
Model: Sonnet 4.6
Sonnet 4.6
Send message
Use incognito...
|
898
|
NULL
|
NULL
|
NULL
|
|
18257
|
791
|
35
|
2026-05-11T11:07:06.213624+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497626213_m2.jpg...
|
iTerm2
|
DEV (docker)
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PnostormcodeFV faVsco.js°9 JY-20725-handle-HS-sear PnostormcodeFV faVsco.js°9 JY-20725-handle-HS-search-rate-limProletey•.gitignoree audio.wavT SyncCrmEntitiesTrait.phpC) CachedCrmServiceDecorator.ongch HandleHn= nuospor-lournal-poll.log© RateLimitException.php© PaginationConfia.phdonounit.xmis ttt.isE oauth-private.keyE oauth-public.kev= storageE supervisord.pidclass JiminnyDebuqcommand extends Command361private function natelamitfor (Si = 0 ; $i < 3; $i++) {if ($i % 25 === 0) {363text-relav..sonscnis"pinto syneine opporcunity 11Sthis->info( string: "Matching contact {$i}"):v testsFeaturescrmservice->syncupporcun1cy 574/20564'Intearationscrmservice->macchbyname "kobot"Servicesv 7UnitActionsm ComnonentM ConficurationConsoleiN ContracteD DomainMntoD EnumsD EventsD Exceptions© EmailActivityImportExcC HandlerT est.php© RateLimitExceptionTes0 fixturesa GuardsD HelpersahiteIntearationsa InteractionsM.Jobs> ActivitvM AiAutomation•M Audio• M AutomatedRenorts@ CreateRecultcTest, 393( RequestGenerateA‹ 394C) RequestGenerateRd( SendRenortEynirineC SendRenort.lohTes© SendReportMailJobe CondDonartNatGonMelondarMemmoveryaetviycrmlaskJoo.php(c) HubSpot/Service.onp© ProviderkateLimiter.phpт | A5 A133 X11 ^1 usageprivate function simulateMatchActivityStorm(int Steamid = 2, int Scount = 100): voidSconfio = steam->oetcrmconflourationobSactivities = Activitv:quervoerm confiauration id' Sconfio->aetidon->orderBvDescd->Uimit(Scount)->getO:Sthis->info( string: "Dispatching {Sactivities->count} MatchActivityCrmData jobs (portal={Sconfig->getidOh)"):fonpach (Sactivities as Cactivitv) 4MatchActivityCrmData::dispatch( ...arguments: Sactivity->getId, $config, true):Sthis->info( string: 'Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.'):no usagesprivate function simulateVerifyTaskStorm(int SteamId = 2, int $count = 100): voidSactavitles = Activity::quervol>where co'team_1d', Steamid)'cem provider id')->net05Sthis->info( string: "Dispatching (Sactivities->count} VerifyActivityCrmTaskJob jobs");foneach (Sactivities as Cactivitv) !Preparation Tor kell.... In o3m100% Mon 11 May 14:0/•00# console [PKoDJ& console lEUllconsole [STAGINGIV.19AA SF [jiminny@localhost]A ho_local Uiminny@localnost[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Date":["Thu,07 May 2026 14:21:15 GMT"]"Lontent-lype". appuicacion/son charset=utt-on"Transfer-Encoding":("chunked"],"CF-Ray": ["9f80deb8db60dc3a-SOF"],"CF-Cache-Status":"DYNAMIC")"Strict-Transport-Security":["max-aqe=31536000: includeSubDomains: preload"]."access-control-allow-credentials":["false"]"server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",cfn:desc="9r80deb8ercodcsa-JAD""."x-content-type-options": ["nosniff"],"x-hubsnot-correlation-id":"019e02d0-6fd8-7812-bdba-885b7cch3ee3")"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZẸXDZyHz2mBUFdzdo2gTHEs0kXMSẸShjK®hGYxNhU07-Mav-26 14:51:15 GMt: domainz.hubaoz.com: HttoOnlv: Secure: SameSite=None"."Renont-Toll•|"\"url\":\"https:|VAV/a.nel.cloudflare.com\V/report\V/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn30%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTz06FM4%2I\"max_age\":604800}"],INFI"•T"S"success fraction":0.ulg"nenont to ": "cf-nel",\"max_age\":604800}"]"Server": ["cloudflare"]}} {"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab" ."trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}W Windsurf Teams 25:27 UTF-8 f 4 spaces ©...
|
NULL
|
-8004532401204884448
|
NULL
|
click
|
ocr
|
NULL
|
PnostormcodeFV faVsco.js°9 JY-20725-handle-HS-sear PnostormcodeFV faVsco.js°9 JY-20725-handle-HS-search-rate-limProletey•.gitignoree audio.wavT SyncCrmEntitiesTrait.phpC) CachedCrmServiceDecorator.ongch HandleHn= nuospor-lournal-poll.log© RateLimitException.php© PaginationConfia.phdonounit.xmis ttt.isE oauth-private.keyE oauth-public.kev= storageE supervisord.pidclass JiminnyDebuqcommand extends Command361private function natelamitfor (Si = 0 ; $i < 3; $i++) {if ($i % 25 === 0) {363text-relav..sonscnis"pinto syneine opporcunity 11Sthis->info( string: "Matching contact {$i}"):v testsFeaturescrmservice->syncupporcun1cy 574/20564'Intearationscrmservice->macchbyname "kobot"Servicesv 7UnitActionsm ComnonentM ConficurationConsoleiN ContracteD DomainMntoD EnumsD EventsD Exceptions© EmailActivityImportExcC HandlerT est.php© RateLimitExceptionTes0 fixturesa GuardsD HelpersahiteIntearationsa InteractionsM.Jobs> ActivitvM AiAutomation•M Audio• M AutomatedRenorts@ CreateRecultcTest, 393( RequestGenerateA‹ 394C) RequestGenerateRd( SendRenortEynirineC SendRenort.lohTes© SendReportMailJobe CondDonartNatGonMelondarMemmoveryaetviycrmlaskJoo.php(c) HubSpot/Service.onp© ProviderkateLimiter.phpт | A5 A133 X11 ^1 usageprivate function simulateMatchActivityStorm(int Steamid = 2, int Scount = 100): voidSconfio = steam->oetcrmconflourationobSactivities = Activitv:quervoerm confiauration id' Sconfio->aetidon->orderBvDescd->Uimit(Scount)->getO:Sthis->info( string: "Dispatching {Sactivities->count} MatchActivityCrmData jobs (portal={Sconfig->getidOh)"):fonpach (Sactivities as Cactivitv) 4MatchActivityCrmData::dispatch( ...arguments: Sactivity->getId, $config, true):Sthis->info( string: 'Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.'):no usagesprivate function simulateVerifyTaskStorm(int SteamId = 2, int $count = 100): voidSactavitles = Activity::quervol>where co'team_1d', Steamid)'cem provider id')->net05Sthis->info( string: "Dispatching (Sactivities->count} VerifyActivityCrmTaskJob jobs");foneach (Sactivities as Cactivitv) !Preparation Tor kell.... In o3m100% Mon 11 May 14:0/•00# console [PKoDJ& console lEUllconsole [STAGINGIV.19AA SF [jiminny@localhost]A ho_local Uiminny@localnost[2026-05-07 14:21:15] local.INF0: [Hubspot] DEBUG Getting headers {"neaders".?"Date":["Thu,07 May 2026 14:21:15 GMT"]"Lontent-lype". appuicacion/son charset=utt-on"Transfer-Encoding":("chunked"],"CF-Ray": ["9f80deb8db60dc3a-SOF"],"CF-Cache-Status":"DYNAMIC")"Strict-Transport-Security":["max-aqe=31536000: includeSubDomains: preload"]."access-control-allow-credentials":["false"]"server-timing": ["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",cfn:desc="9r80deb8ercodcsa-JAD""."x-content-type-options": ["nosniff"],"x-hubsnot-correlation-id":"019e02d0-6fd8-7812-bdba-885b7cch3ee3")"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZẸXDZyHz2mBUFdzdo2gTHEs0kXMSẸShjK®hGYxNhU07-Mav-26 14:51:15 GMt: domainz.hubaoz.com: HttoOnlv: Secure: SameSite=None"."Renont-Toll•|"\"url\":\"https:|VAV/a.nel.cloudflare.com\V/report\V/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn30%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTz06FM4%2I\"max_age\":604800}"],INFI"•T"S"success fraction":0.ulg"nenont to ": "cf-nel",\"max_age\":604800}"]"Server": ["cloudflare"]}} {"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab" ."trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}W Windsurf Teams 25:27 UTF-8 f 4 spaces ©...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
25019
|
1051
|
6
|
2026-05-12T10:34:39.821627+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778582079821_m2.jpg...
|
Slack
|
Galya Dimitrova (DM) - Jiminny Inc - 4 new items - Galya Dimitrova (DM) - Jiminny Inc - 4 new items - Slack...
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Galya Dimitrova
Steliyan Georgiev
Petko Kashinski
Aneliya Angelova
Stefka Stoyanova
Vasil Vasilev
Nikolay Ivanov
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Lukas Kovalik
you
Jira Cloud
Toast
Google Calendar
Messages
Messages
Files
Files
Untitled
Untitled
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Today at 12:08:38 PM
12:08
този Планхат да ти кажа само проблеми с него
Today at 12:08:42 PM
12:08
каквото и да се пробваш да правиш
Lukas Kovalik
Today at 12:09:04 PM
12:09 PM
да явно беше cache
Today at 12:09:48 PM
12:09
това за sentry при липсващ pdf_url се оказа само един репорт
Today at 12:10:16 PM
12:10
същия го има като podcast и си работи
Today at 12:11:12 PM
12:11
Говорих със Стели да погледне някаква валидация в самия prophet
Today at 12:11:51 PM
12:11
ще го види още и ако трябва за бъдеше да направиме някакъв flow
Today at 12:12:01 PM
12:12
image.png
Toggle file
image.png
Galya Dimitrova
Today at 12:12:26 PM
12:12 PM
ок, ако е само един репорт може сега да го сетнем него на failed или нещо друго за да спре да спами сентри
Today at 12:12:33 PM
12:12
и да оставя тикета в беклога
Today at 12:12:34 PM
12:12
как мислиш
Lukas Kovalik
Today at 12:13:20 PM
12:13 PM
добре, да му кажа да не го гледа повече на Стели?
Today at 12:13:33 PM
12:13
или все пак да има за backlog
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:14:16 PM
12:14
да взема ли това със UP сега?
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:14:26 PM
12:14 PM
да го види за беклога. Ако нещо лесно измисли може и скоро да го направим
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:14:31 PM
12:14 PM
https://jiminny.atlassian.net/browse/JY-20773
https://jiminny.atlassian.net/browse/JY-20773
Jira Cloud
Jira Cloud
Remove preview
Jira Cloud Bug JY-20773 User Pilot not receiving events on report generated Bug JY-20773 in Jira Cloud Preview in Slack Status Backlog Priority Medium Medium Assignee Unassigned Unassigned As of today at 12:14 PM Refresh Open in Jira ✨ Summarise
User Pilot not receiving events on report generated
Bug JY-20773 in Jira Cloud
Preview in Slack
Status
Backlog
Priority
Medium
Assignee
Unassigned
As of today at 12:14 PM
Refresh
Open in Jira
✨ Summarise
Open in browser
Open
Share Bug JY-20773
View conversations
More actions
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:14:38 PM
12:14 PM
за това да пипнеш репорта да спре да гърми искаш ли тикет?
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:14:46 PM
12:14
иначе да, нека видим UP kкава му е драмата
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:15:31 PM
12:15 PM
ами ще напиша комент във съществуващ
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:22:18 PM
12:22 PM
Идеята ми е да спрем този репорт да се пробва да се праща и да спами сентри
.
А пък Стели вече ще гледа за фикс за бъдещи такива случаи
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:26:00 PM
12:26 PM
да разбрах, сега ще го маркирам като failed да не го взима следващия крон
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:26:14 PM
12:26 PM
ok
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:26:15 PM
12:26 PM
ако трябва да се пипне и в кода ще си направя тикет
1 reaction, react with +1 emoji
1
Add reaction…
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:26:41 PM
12:26 PM
малко ми е лудница тука между MCP i desktop aпа и какво ли още не и прескачам от чат на чат
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:27:25 PM
12:27 PM
разбира се и аз трябваше по-точно да го кажа
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:27:37 PM
12:27
ще ти пиша дали се оправило
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:29:38 PM
12:29 PM
А не
.
Ти сигурно ок си го казал ама чета по диагонал
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:29:53 PM
12:29
И другата седмица имаме презднтации пред борда в Лондон и съм до никъде
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Processing uploaded file… complete! Message ready to be sent.
loading…...
|
[{"role":"AXPopUpButton","text [{"role":"AXPopUpButton","text":"Switch workspaces… (Jiminny Inc) Has new messages","depth":14,"bounds":{"left":0.5056516,"top":0.058260176,"width":0.011968086,"height":0.028731046},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Home","depth":14,"bounds":{"left":0.50299203,"top":0.10055866,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Home","depth":16,"bounds":{"left":0.50664896,"top":0.13806863,"width":0.009973404,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"DMs","depth":14,"bounds":{"left":0.50299203,"top":0.15482841,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DMs","depth":16,"bounds":{"left":0.50764626,"top":0.19233839,"width":0.007978723,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Activity","depth":14,"bounds":{"left":0.50299203,"top":0.20909816,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Activity","depth":16,"bounds":{"left":0.5053192,"top":0.24660814,"width":0.012965426,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5053192,"top":0.24660814,"width":0.0026595744,"height":0.011173184}},{"char_start":1,"char_count":7,"bounds":{"left":0.50764626,"top":0.24660814,"width":0.010638298,"height":0.011173184}}],"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":14,"bounds":{"left":0.50299203,"top":0.26336792,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":16,"bounds":{"left":0.50797874,"top":0.3008779,"width":0.0076462766,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.50797874,"top":0.3008779,"width":0.0019946808,"height":0.011173184}},{"char_start":1,"char_count":4,"bounds":{"left":0.5099734,"top":0.3008779,"width":0.0056515955,"height":0.011173184}}],"role_description":"text"},{"role":"AXRadioButton","text":"Later","depth":14,"bounds":{"left":0.50299203,"top":0.31763768,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Later","depth":16,"bounds":{"left":0.50731385,"top":0.35514766,"width":0.008643617,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.50731385,"top":0.35514766,"width":0.0019946808,"height":0.011173184}},{"char_start":1,"char_count":4,"bounds":{"left":0.5093085,"top":0.35514766,"width":0.0066489363,"height":0.011173184}}],"role_description":"text"},{"role":"AXRadioButton","text":"More…","depth":14,"bounds":{"left":0.50299203,"top":0.3719074,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More","depth":16,"bounds":{"left":0.50731385,"top":0.4094174,"width":0.008976064,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.50731385,"top":0.4094174,"width":0.0033244682,"height":0.011173184}},{"char_start":1,"char_count":3,"bounds":{"left":0.5106383,"top":0.4094174,"width":0.0056515955,"height":0.011173184}}],"role_description":"text"},{"role":"AXStaticText","text":"Unreads","depth":21,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Threads","depth":21,"bounds":{"left":0.5369016,"top":0.09976058,"width":0.01761968,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5369016,"top":0.09976058,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.5398936,"top":0.09976058,"width":0.01462766,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Huddles","depth":21,"bounds":{"left":0.5369016,"top":0.12210695,"width":0.018284574,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5369016,"top":0.12210695,"width":0.0039893617,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.54089093,"top":0.12210695,"width":0.014295213,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Drafts & sent","depth":21,"bounds":{"left":0.5369016,"top":0.14445332,"width":0.02925532,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5369016,"top":0.14445332,"width":0.003656915,"height":0.014365523}},{"char_start":1,"char_count":12,"bounds":{"left":0.5405585,"top":0.14445332,"width":0.025265958,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"1","depth":21,"bounds":{"left":0.5884308,"top":0.1452514,"width":0.0026595744,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Directories","depth":21,"bounds":{"left":0.5369016,"top":0.16679968,"width":0.024268618,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5369016,"top":0.16679968,"width":0.0039893617,"height":0.014365523}},{"char_start":1,"char_count":10,"bounds":{"left":0.54089093,"top":0.16679968,"width":0.020279255,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"jiminny-x-integration-app","depth":23,"bounds":{"left":0.5422208,"top":0.26097366,"width":0.043882977,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.26097366,"width":0.0013297872,"height":0.014365523}},{"char_start":1,"char_count":24,"bounds":{"left":0.54355055,"top":0.26097366,"width":0.05418883,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"platform-inner-team","depth":23,"bounds":{"left":0.5422208,"top":0.28332004,"width":0.04454787,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.28332004,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":18,"bounds":{"left":0.54521275,"top":0.28332004,"width":0.04155585,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"ai-chapter","depth":23,"bounds":{"left":0.5422208,"top":0.33599362,"width":0.022273935,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.33599362,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":9,"bounds":{"left":0.54488033,"top":0.33599362,"width":0.019614361,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"alerts","depth":23,"bounds":{"left":0.5422208,"top":0.35834,"width":0.012300532,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.35834,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":5,"bounds":{"left":0.54488033,"top":0.35834,"width":0.00930851,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"backend","depth":23,"bounds":{"left":0.5422208,"top":0.38068634,"width":0.018284574,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.38068634,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.54521275,"top":0.38068634,"width":0.015292553,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"bugs","depth":23,"bounds":{"left":0.5422208,"top":0.40303272,"width":0.010638298,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.40303272,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":3,"bounds":{"left":0.54521275,"top":0.40303272,"width":0.00731383,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"confusion-clinic","depth":23,"bounds":{"left":0.5422208,"top":0.4253791,"width":0.034574468,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.4253791,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.54454786,"top":0.4253791,"width":0.032247342,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"curiosity_lab","depth":23,"bounds":{"left":0.5422208,"top":0.44772545,"width":0.027593086,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.44772545,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":12,"bounds":{"left":0.54454786,"top":0.44772545,"width":0.025265958,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"engineering","depth":23,"bounds":{"left":0.5422208,"top":0.47007182,"width":0.025930852,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.47007182,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":10,"bounds":{"left":0.54488033,"top":0.47007182,"width":0.022938829,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"general","depth":23,"bounds":{"left":0.5422208,"top":0.4924182,"width":0.016289894,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.4924182,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.54488033,"top":0.4924182,"width":0.013297873,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"jiminny-bg","depth":23,"bounds":{"left":0.5422208,"top":0.51476455,"width":0.023271276,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.51476455,"width":0.0013297872,"height":0.014365523}},{"char_start":1,"char_count":9,"bounds":{"left":0.54355055,"top":0.51476455,"width":0.021609042,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"platform-tickets","depth":23,"bounds":{"left":0.5422208,"top":0.5371109,"width":0.034906916,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.5371109,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.54521275,"top":0.5371109,"width":0.031914894,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"product_launches","depth":23,"bounds":{"left":0.5422208,"top":0.5594573,"width":0.03856383,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.5594573,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.54521275,"top":0.5594573,"width":0.03557181,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"random","depth":23,"bounds":{"left":0.5422208,"top":0.5818037,"width":0.016954787,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.5818037,"width":0.0019946808,"height":0.014365523}},{"char_start":1,"char_count":5,"bounds":{"left":0.54421544,"top":0.5818037,"width":0.014960106,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"releases","depth":23,"bounds":{"left":0.5422208,"top":0.60415006,"width":0.018284574,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.60415006,"width":0.0019946808,"height":0.014365523}},{"char_start":1,"char_count":7,"bounds":{"left":0.54421544,"top":0.60415006,"width":0.016289894,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"sofia-office","depth":23,"bounds":{"left":0.5422208,"top":0.62649643,"width":0.024601065,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.62649643,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":11,"bounds":{"left":0.54454786,"top":0.62649643,"width":0.021941489,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"support","depth":23,"bounds":{"left":0.5422208,"top":0.64884275,"width":0.017287234,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.64884275,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.54454786,"top":0.64884275,"width":0.01462766,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"thank-yous","depth":23,"bounds":{"left":0.5422208,"top":0.6711891,"width":0.024601065,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.6711891,"width":0.0019946808,"height":0.014365523}},{"char_start":1,"char_count":9,"bounds":{"left":0.54421544,"top":0.6711891,"width":0.022606382,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"the_people_of_jiminny","depth":23,"bounds":{"left":0.5422208,"top":0.6935355,"width":0.045212764,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.6935355,"width":0.0019946808,"height":0.014365523}},{"char_start":1,"char_count":20,"bounds":{"left":0.54421544,"top":0.6935355,"width":0.04720745,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Galya Dimitrova","depth":23,"bounds":{"left":0.5422208,"top":0.7462091,"width":0.03523936,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.7462091,"width":0.003656915,"height":0.014365523}},{"char_start":1,"char_count":14,"bounds":{"left":0.54587764,"top":0.7462091,"width":0.03158245,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":23,"bounds":{"left":0.5422208,"top":0.76855546,"width":0.038231384,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.76855546,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":16,"bounds":{"left":0.54488033,"top":0.76855546,"width":0.03557181,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Petko Kashinski","depth":23,"bounds":{"left":0.5422208,"top":0.79090184,"width":0.034574468,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.79090184,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":14,"bounds":{"left":0.54521275,"top":0.79090184,"width":0.03158245,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"bounds":{"left":0.5422208,"top":0.8132482,"width":0.03756649,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.8132482,"width":0.0033244682,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.5455452,"top":0.8132482,"width":0.034242023,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Stefka Stoyanova","depth":23,"bounds":{"left":0.5422208,"top":0.8355946,"width":0.037898935,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.8355946,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.54488033,"top":0.8355946,"width":0.03523936,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Vasil Vasilev","depth":23,"bounds":{"left":0.5422208,"top":0.8579409,"width":0.026595745,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.8579409,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":12,"bounds":{"left":0.54521275,"top":0.8579409,"width":0.023271276,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Ivanov","depth":23,"bounds":{"left":0.5422208,"top":0.8802873,"width":0.032247342,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.8802873,"width":0.0039893617,"height":0.014365523}},{"char_start":1,"char_count":13,"bounds":{"left":0.5462101,"top":0.8802873,"width":0.027925532,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"bounds":{"left":0.5422208,"top":0.90263367,"width":0.03756649,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.90263367,"width":0.0033244682,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.5455452,"top":0.90263367,"width":0.034242023,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"bounds":{"left":0.57978725,"top":0.90263367,"width":0.0063164895,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Yankov","depth":23,"bounds":{"left":0.58211434,"top":0.90263367,"width":0.014295213,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.58211434,"top":0.90263367,"width":0.0039893617,"height":0.014365523}},{"char_start":1,"char_count":13,"bounds":{"left":0.58610374,"top":0.90263367,"width":0.028922873,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Stoyan Tanev","depth":23,"bounds":{"left":0.5422208,"top":0.92498004,"width":0.028922873,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.92498004,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":11,"bounds":{"left":0.54488033,"top":0.92498004,"width":0.026263298,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Lukas Kovalik","depth":23,"bounds":{"left":0.5422208,"top":0.9473264,"width":0.029587766,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.9473264,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":12,"bounds":{"left":0.54488033,"top":0.9473264,"width":0.026928192,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"you","depth":23,"bounds":{"left":0.5744681,"top":0.9473264,"width":0.0063164895,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5744681,"top":0.9473264,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":2,"bounds":{"left":0.5767952,"top":0.9473264,"width":0.0056515955,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Jira Cloud","depth":23,"bounds":{"left":0.5422208,"top":0.9952115,"width":0.021941489,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Toast","depth":23,"bounds":{"left":0.5422208,"top":0.9952115,"width":0.011635638,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Google Calendar","depth":23,"bounds":{"left":0.5422208,"top":0.9952115,"width":0.030585106,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Messages","depth":17,"bounds":{"left":0.60206115,"top":0.09177973,"width":0.030917553,"height":0.030327214},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Messages","depth":19,"bounds":{"left":0.61136967,"top":0.10055866,"width":0.018949468,"height":0.012769354},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.61136967,"top":0.10055866,"width":0.0039893617,"height":0.012769354}},{"char_start":1,"char_count":7,"bounds":{"left":0.61535907,"top":0.10055866,"width":0.014960106,"height":0.012769354}}],"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":17,"bounds":{"left":0.63397604,"top":0.09177973,"width":0.020944148,"height":0.030327214},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":19,"bounds":{"left":0.64328456,"top":0.10055866,"width":0.008976064,"height":0.012769354},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.64328456,"top":0.10055866,"width":0.0026595744,"height":0.012769354}},{"char_start":1,"char_count":4,"bounds":{"left":0.6459442,"top":0.10055866,"width":0.0063164895,"height":0.012769354}}],"role_description":"text"},{"role":"AXRadioButton","text":"Untitled","depth":17,"bounds":{"left":0.65625,"top":0.09177973,"width":0.02925532,"height":0.030327214},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Untitled","depth":19,"bounds":{"left":0.6655585,"top":0.10055866,"width":0.015957447,"height":0.012769354},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.6655585,"top":0.10055866,"width":0.0033244682,"height":0.012769354}},{"char_start":1,"char_count":7,"bounds":{"left":0.66855055,"top":0.10055866,"width":0.012965426,"height":0.012769354}}],"role_description":"text"},{"role":"AXPopUpButton","text":"Add and Edit Channel Tabs","depth":17,"bounds":{"left":0.68650264,"top":0.09177973,"width":0.010970744,"height":0.030327214},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Canvas","depth":17,"bounds":{"left":0.59640956,"top":0.0518755,"width":0.015957447,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"List","depth":17,"bounds":{"left":0.59640956,"top":0.0518755,"width":0.007978723,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":17,"bounds":{"left":0.59640956,"top":0.0518755,"width":0.013962766,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXPopUpButton","text":"Jump to date","depth":23,"bounds":{"left":0.7849069,"top":0.12689546,"width":0.025265958,"height":0.022346368},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:08:38 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:08","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"този Планхат да ти кажа само проблеми с него","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:08:42 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:08","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"каквото и да се пробваш да правиш","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:09:04 PM","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:09 PM","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"да явно беше cache","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:09:48 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:09","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"това за sentry при липсващ pdf_url се оказа само един репорт","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:10:16 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:10","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"същия го има като podcast и си работи","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:11:12 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:11","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Говорих със Стели да погледне някаква валидация в самия prophet","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:11:51 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:11","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ще го види още и ако трябва за бъдеше да направиме някакъв flow","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:12:01 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:12","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"image.png","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Toggle file","depth":25,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXLink","text":"image.png","depth":27,"on_screen":false,"role_description":"Unlabelled image","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:12:26 PM","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:12 PM","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ок, ако е само един репорт може сега да го сетнем него на failed или нещо друго за да спре да спами сентри","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:12:33 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:12","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"и да оставя тикета в беклога","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:12:34 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:12","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"как мислиш","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:13:20 PM","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:13 PM","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"добре, да му кажа да не го гледа повече на Стели?","depth":25,"bounds":{"left":0.6180186,"top":0.11572227,"width":0.11735372,"height":0.013567438},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.6180186,"top":0.114924185,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":48,"bounds":{"left":0.62101066,"top":0.114924185,"width":0.1143617,"height":0.014365523}}],"role_description":"text"},{"role":"AXLink","text":"Today at 12:13:33 PM","depth":25,"bounds":{"left":0.6050532,"top":0.14126097,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:13","depth":26,"bounds":{"left":0.6050532,"top":0.14126097,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"или все пак да има за backlog","depth":25,"bounds":{"left":0.6180186,"top":0.13886672,"width":0.06781915,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:14:16 PM","depth":25,"bounds":{"left":0.6050532,"top":0.16520351,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14","depth":26,"bounds":{"left":0.6050532,"top":0.16520351,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"да взема ли това със UP сега?","depth":25,"bounds":{"left":0.6180186,"top":0.16280925,"width":0.068484046,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.18515563,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.1867518,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:14:26 PM","depth":24,"bounds":{"left":0.6569149,"top":0.18914606,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14 PM","depth":25,"bounds":{"left":0.6569149,"top":0.18914606,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"да го види за беклога. Ако нещо лесно измисли може и скоро да го направим","depth":25,"bounds":{"left":0.6180186,"top":0.20430966,"width":0.17985372,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.22665602,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.22825219,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:14:31 PM","depth":24,"bounds":{"left":0.6515958,"top":0.23064645,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14 PM","depth":25,"bounds":{"left":0.6515958,"top":0.23064645,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"https://jiminny.atlassian.net/browse/JY-20773","depth":25,"bounds":{"left":0.6180186,"top":0.24581006,"width":0.10106383,"height":0.014365523},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"https://jiminny.atlassian.net/browse/JY-20773","depth":26,"bounds":{"left":0.6180186,"top":0.24581006,"width":0.10106383,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Jira Cloud","depth":24,"bounds":{"left":0.6180186,"top":0.26895452,"width":0.018949468,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Jira Cloud","depth":24,"bounds":{"left":0.63829786,"top":0.26895452,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXButton","text":"Remove preview","depth":26,"bounds":{"left":0.61136967,"top":0.28731045,"width":0.0066489363,"height":0.016759777},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Jira Cloud Bug JY-20773 User Pilot not receiving events on report generated Bug JY-20773 in Jira Cloud Preview in Slack Status Backlog Priority Medium Medium Assignee Unassigned Unassigned As of today at 12:14 PM Refresh Open in Jira ✨ Summarise","depth":26,"bounds":{"left":0.6180186,"top":0.2857143,"width":0.15957446,"height":0.13727055},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"User Pilot not receiving events on report generated","depth":27,"bounds":{"left":0.63829786,"top":0.29928172,"width":0.11336436,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Bug JY-20773 in Jira Cloud","depth":28,"bounds":{"left":0.63829786,"top":0.31524342,"width":0.051861703,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Preview in Slack","depth":28,"bounds":{"left":0.63829786,"top":0.31524342,"width":0.03125,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Status","depth":27,"bounds":{"left":0.63829786,"top":0.33838788,"width":0.011968086,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Backlog","depth":27,"bounds":{"left":0.63962764,"top":0.3575419,"width":0.017287234,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Priority","depth":27,"bounds":{"left":0.6662234,"top":0.33838788,"width":0.013962766,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Medium","depth":27,"bounds":{"left":0.67420214,"top":0.3575419,"width":0.017952127,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Assignee","depth":27,"bounds":{"left":0.70146275,"top":0.33838788,"width":0.016954787,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Unassigned","depth":27,"bounds":{"left":0.7094415,"top":0.3575419,"width":0.025265958,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"As of today at 12:14 PM","depth":28,"bounds":{"left":0.62234044,"top":0.3982442,"width":0.046210106,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Refresh","depth":28,"bounds":{"left":0.66988033,"top":0.40143654,"width":0.01462766,"height":0.006384677},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Jira","depth":28,"bounds":{"left":0.7074468,"top":0.3934557,"width":0.030917553,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"✨ Summarise","depth":28,"bounds":{"left":0.7393617,"top":0.3934557,"width":0.03523936,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Open in browser","depth":27,"bounds":{"left":0.7144282,"top":0.29928172,"width":0.022606382,"height":0.025538707},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Open","depth":28,"bounds":{"left":0.7237367,"top":0.3048683,"width":0.010638298,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Share Bug JY-20773","depth":27,"bounds":{"left":0.7400266,"top":0.29928172,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View conversations","depth":27,"bounds":{"left":0.7506649,"top":0.29928172,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More actions","depth":27,"bounds":{"left":0.7613032,"top":0.29928172,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.43256184,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.43415803,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:14:38 PM","depth":24,"bounds":{"left":0.6569149,"top":0.4365523,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14 PM","depth":25,"bounds":{"left":0.6569149,"top":0.4365523,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"за това да пипнеш репорта да спре да гърми искаш ли тикет?","depth":25,"bounds":{"left":0.6180186,"top":0.4517159,"width":0.14261968,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:14:46 PM","depth":25,"bounds":{"left":0.6050532,"top":0.47805268,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14","depth":26,"bounds":{"left":0.6050532,"top":0.47805268,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"иначе да, нека видим UP kкава му е драмата","depth":25,"bounds":{"left":0.6180186,"top":0.47565842,"width":0.102726065,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.4980048,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.49960095,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:15:31 PM","depth":24,"bounds":{"left":0.6515958,"top":0.5019952,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:15 PM","depth":25,"bounds":{"left":0.6515958,"top":0.5019952,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ами ще напиша комент във съществуващ","depth":25,"bounds":{"left":0.6180186,"top":0.5171588,"width":0.095744684,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.90625,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.9168883,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.9275266,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.9381649,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.9488032,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.9594415,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.9700798,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.9807181,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.5395052,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.54110134,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:22:18 PM","depth":24,"bounds":{"left":0.6569149,"top":0.5434956,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:22 PM","depth":25,"bounds":{"left":0.6569149,"top":0.5434956,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Идеята ми е да спрем този репорт да се пробва да се праща и да спами сентри","depth":25,"bounds":{"left":0.6180186,"top":0.5586592,"width":0.18351063,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".","depth":25,"bounds":{"left":0.8011968,"top":0.5586592,"width":0.0013297872,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"А пък Стели вече ще гледа за фикс за бъдещи такива случаи","depth":25,"bounds":{"left":0.8025266,"top":0.5586592,"width":0.14162233,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.5810056,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.5826017,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:26:00 PM","depth":24,"bounds":{"left":0.6515958,"top":0.584996,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:26 PM","depth":25,"bounds":{"left":0.6515958,"top":0.584996,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"да разбрах, сега ще го маркирам като failed да не го взима следващия крон","depth":25,"bounds":{"left":0.6180186,"top":0.60015965,"width":0.17386968,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.62250596,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.6241022,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:26:14 PM","depth":24,"bounds":{"left":0.6569149,"top":0.62649643,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:26 PM","depth":25,"bounds":{"left":0.6569149,"top":0.62649643,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ok","depth":25,"bounds":{"left":0.6180186,"top":0.64166003,"width":0.0056515955,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.6640064,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.66560256,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:26:15 PM","depth":24,"bounds":{"left":0.6515958,"top":0.6679968,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:26 PM","depth":25,"bounds":{"left":0.6515958,"top":0.6679968,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ако трябва да се пипне и в кода ще си направя тикет","depth":25,"bounds":{"left":0.6180186,"top":0.6831604,"width":0.12167553,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"1 reaction, react with +1 emoji","depth":25,"bounds":{"left":0.6180186,"top":0.70231444,"width":0.014295213,"height":0.01915403},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":26,"bounds":{"left":0.62732714,"top":0.7055068,"width":0.0023271276,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Add reaction…","depth":25,"bounds":{"left":0.6336436,"top":0.70231444,"width":0.011303191,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.7310455,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.73264164,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:26:41 PM","depth":24,"bounds":{"left":0.6569149,"top":0.7350359,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:26 PM","depth":25,"bounds":{"left":0.6569149,"top":0.7350359,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"малко ми е лудница тука между MCP i desktop aпа и какво ли още не и прескачам от чат на чат","depth":25,"bounds":{"left":0.6180186,"top":0.7501995,"width":0.22074468,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.7725459,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.7741421,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:27:25 PM","depth":24,"bounds":{"left":0.6515958,"top":0.7765363,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:27 PM","depth":25,"bounds":{"left":0.6515958,"top":0.7765363,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"разбира се и аз трябваше по-точно да го кажа","depth":25,"bounds":{"left":0.6180186,"top":0.79169995,"width":0.10638298,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:27:37 PM","depth":25,"bounds":{"left":0.6050532,"top":0.81803674,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:27","depth":26,"bounds":{"left":0.6050532,"top":0.81803674,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ще ти пиша дали се оправило","depth":25,"bounds":{"left":0.6180186,"top":0.8156425,"width":0.06948138,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.83798885,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.839585,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:29:38 PM","depth":24,"bounds":{"left":0.6569149,"top":0.84197927,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:29 PM","depth":25,"bounds":{"left":0.6569149,"top":0.84197927,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"А не","depth":25,"bounds":{"left":0.6180186,"top":0.85714287,"width":0.010305851,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".","depth":25,"bounds":{"left":0.62799203,"top":0.85714287,"width":0.0013297872,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Ти сигурно ок си го казал ама чета по диагонал","depth":25,"bounds":{"left":0.6293218,"top":0.85714287,"width":0.11037234,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:29:53 PM","depth":25,"bounds":{"left":0.6050532,"top":0.88347965,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:29","depth":26,"bounds":{"left":0.6050532,"top":0.88347965,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"И другата седмица имаме презднтации пред борда в Лондон и съм до никъде","depth":25,"bounds":{"left":0.6180186,"top":0.8810854,"width":0.18218085,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"","depth":23,"bounds":{"left":0.6037234,"top":0.91380686,"width":0.38763297,"height":0.030327214},"on_screen":true,"value":"","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Processing uploaded file… complete! Message ready to be sent.","depth":11,"bounds":{"left":0.5,"top":0.9992019,"width":0.022938829,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"loading…","depth":11,"bounds":{"left":0.5,"top":0.9992019,"width":0.018949468,"height":0.0007980846},"on_screen":true,"role_description":"text"}]...
|
-8000585667208669092
|
-1285472209453266862
|
idle
|
hybrid
|
NULL
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Galya Dimitrova
Steliyan Georgiev
Petko Kashinski
Aneliya Angelova
Stefka Stoyanova
Vasil Vasilev
Nikolay Ivanov
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Lukas Kovalik
you
Jira Cloud
Toast
Google Calendar
Messages
Messages
Files
Files
Untitled
Untitled
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Today at 12:08:38 PM
12:08
този Планхат да ти кажа само проблеми с него
Today at 12:08:42 PM
12:08
каквото и да се пробваш да правиш
Lukas Kovalik
Today at 12:09:04 PM
12:09 PM
да явно беше cache
Today at 12:09:48 PM
12:09
това за sentry при липсващ pdf_url се оказа само един репорт
Today at 12:10:16 PM
12:10
същия го има като podcast и си работи
Today at 12:11:12 PM
12:11
Говорих със Стели да погледне някаква валидация в самия prophet
Today at 12:11:51 PM
12:11
ще го види още и ако трябва за бъдеше да направиме някакъв flow
Today at 12:12:01 PM
12:12
image.png
Toggle file
image.png
Galya Dimitrova
Today at 12:12:26 PM
12:12 PM
ок, ако е само един репорт може сега да го сетнем него на failed или нещо друго за да спре да спами сентри
Today at 12:12:33 PM
12:12
и да оставя тикета в беклога
Today at 12:12:34 PM
12:12
как мислиш
Lukas Kovalik
Today at 12:13:20 PM
12:13 PM
добре, да му кажа да не го гледа повече на Стели?
Today at 12:13:33 PM
12:13
или все пак да има за backlog
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:14:16 PM
12:14
да взема ли това със UP сега?
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:14:26 PM
12:14 PM
да го види за беклога. Ако нещо лесно измисли може и скоро да го направим
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:14:31 PM
12:14 PM
https://jiminny.atlassian.net/browse/JY-20773
https://jiminny.atlassian.net/browse/JY-20773
Jira Cloud
Jira Cloud
Remove preview
Jira Cloud Bug JY-20773 User Pilot not receiving events on report generated Bug JY-20773 in Jira Cloud Preview in Slack Status Backlog Priority Medium Medium Assignee Unassigned Unassigned As of today at 12:14 PM Refresh Open in Jira ✨ Summarise
User Pilot not receiving events on report generated
Bug JY-20773 in Jira Cloud
Preview in Slack
Status
Backlog
Priority
Medium
Assignee
Unassigned
As of today at 12:14 PM
Refresh
Open in Jira
✨ Summarise
Open in browser
Open
Share Bug JY-20773
View conversations
More actions
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:14:38 PM
12:14 PM
за това да пипнеш репорта да спре да гърми искаш ли тикет?
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:14:46 PM
12:14
иначе да, нека видим UP kкава му е драмата
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:15:31 PM
12:15 PM
ами ще напиша комент във съществуващ
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:22:18 PM
12:22 PM
Идеята ми е да спрем този репорт да се пробва да се праща и да спами сентри
.
А пък Стели вече ще гледа за фикс за бъдещи такива случаи
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:26:00 PM
12:26 PM
да разбрах, сега ще го маркирам като failed да не го взима следващия крон
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:26:14 PM
12:26 PM
ok
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:26:15 PM
12:26 PM
ако трябва да се пипне и в кода ще си направя тикет
1 reaction, react with +1 emoji
1
Add reaction…
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:26:41 PM
12:26 PM
малко ми е лудница тука между MCP i desktop aпа и какво ли още не и прескачам от чат на чат
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:27:25 PM
12:27 PM
разбира се и аз трябваше по-точно да го кажа
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:27:37 PM
12:27
ще ти пиша дали се оправило
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:29:38 PM
12:29 PM
А не
.
Ти сигурно ок си го казал ама чета по диагонал
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:29:53 PM
12:29
И другата седмица имаме презднтации пред борда в Лондон и съм до никъде
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Processing uploaded file… complete! Message ready to be sent.
loading…
slackEditVIewTypeError: League|Flysystem|FileCloudWatch | us-east-2G Jy 20820 es reindex stream mod(UY-20725) [HubSpot) Optimise CFJY-20725 add HS rate limit handlitPipelines - jiminny/app( Pull requests • jiminny/appWJY-207731 User Pilot not receivini( Jr-20773 fix user pilot tracking forJY-207761 Automated report - seP Platform Sorint 2 02 . Platform Te@JY-20625 | JY-20742 | MCP POCЬ— Data Exoloren* (UY-20776] Automated report - ser8 Jiminny• Jy-20725 add HS rate limit handlill(SRD-6793) Les Mills activity typePlatform Team - Backlog - JiraPtly-207791 Uiser Dilat not receivinJY-20773 fix user pilot trackin xPipelines - jiminny/app— New TabmistoryWindowHelp• github.com/jiminny/app/pull/12024jiminny / app &<> Code8? Pull requests 32( Agents • Actions L Wiki ® Security and quality 4InsightsLộ Settings@ On April 24 we'll start using GitHub Copilot interaction data for Al model training unless you opt out. Review this update and manage your preferences in your GitHub account settings.JY-20773 fix user pilot tracking for a#12024 •i7 OperLakyLak wants to merge 2 commits into master from JY-20f) Conversation• Commits 2|Fl, Checks3E FileLakvlak commented 2 weeks agoWritePreviewH B### JIRA: JY-20//3#### Chanaes.- Add SerializesModels trait as it seems the UP needs that forE LakyLak and others added 2 commits 2 weeks ago@ Jy-20773 fix user pilot tracking ofr automated repc@@Merge branch 'master' into JY-20773-fix-automated-sonaraubecloud Bot commented 7 minutes agol~ Quality Gate passedIssuesv O New issues0 Accepted issuesMeasuresv O Security Hotspots• U.0% Coverage on New Codev 0.0% Duplication on New CodeSee analvsis details on SonarQube CloudiHomeDMSActivityLaterMoreJiminny...ye Threadsд HuddlesDrafts & sent)DirectoriesAb External connections# Starred8 jiminny-x-integrati...platform-inner-team® Channels# ai-chapter# alerts# backend# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product launches# random# releases"sona-oince# supportt thank-vous# the_people_of jimi...• Direct messages%. Galya DimitrovaR. Steliyan Georgiev@ Dotko KochinckiRº. Aneliya AngelovaFA. Stefka Stoyanova€. Vasil Vasilev 1A Nikolay Ivanov(3) Aneliva Angelova....3 Stovan Taneve lukas Kovalk v::: Apps$0"suppon Dally • In 1h 20m100% Lz• lue 1z May 13•34'39Q Describe what you are looking for₫ . Galya DimitrovaMessagesr FilesUntitledTodayили все пак да има за backlogда взема ли това със UP cега?Galya Dimitrova 12:14 PMла го види за беклога. Ако нешо лесно измисли може и скоро ла го направимlukas Kovalk 12:14PMhttps://iiminnv.atlassian.net/browse/JY-20773Jira CloudUser Pilot not receiving events on report generatedBug JY-20773 in Jira CloudBacklog= Mediumg UnassignedAs of today at 12:14 PMOpen in Jiracalva Dimitrova 12:14 PMза това ла пипнеш репорта ла спое ла гьоми искаш ли тикет?иначе да, нека вилим UP kкава му е драматаLukas Kovalik 12:15PMами ше напиша комент във съществувашGalya Dimitrova 12-22 PMидеята ми е да спрем този репорт да се проова да се праща и да спами сентри. А пьк стели вече ще гледа за фикс за оъдещи такива случаиLukas Kovalik 12:26 PMда разбрах, сега ще го маркирам като failed да не го взима следващия кронGalya Dimitrova 12:26 PMLukas Kovalik 12:26 PMако трябва да се пипне и в кода ще си направя тикетGalya Dimitrova 12:26 PMмалко ми е лудница тука межлу MСР і desktop апа и какво ли още не и прескачам от чат на чатLukas Kovalik 12:27 PMразоира се и аз тояоваше по-точно да го кажаще ти пиша дали се оправилоGalya Dimitrova 12:29 PMА не. Ти сигурно ок си го казал ама чета по диагоналИ другата седмица имаме презднтации пред борда в Лондон и съм до никъдеMessage Galya Dimitrova+ Aa...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
25029
|
1051
|
11
|
2026-05-12T10:37:14.444372+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778582234444_m2.jpg...
|
Slack
|
Galya Dimitrova (DM) - Jiminny Inc - 4 new items - Galya Dimitrova (DM) - Jiminny Inc - 4 new items - Slack...
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Galya Dimitrova
Steliyan Georgiev
Petko Kashinski
Aneliya Angelova
Stefka Stoyanova
Vasil Vasilev
Nikolay Ivanov
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Lukas Kovalik
you
Jira Cloud
Toast
Google Calendar
Messages
Messages
Files
Files
Untitled
Untitled
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Today at 12:08:38 PM
12:08
този Планхат да ти кажа само проблеми с него
Today at 12:08:42 PM
12:08
каквото и да се пробваш да правиш
Lukas Kovalik
Today at 12:09:04 PM
12:09 PM
да явно беше cache
Today at 12:09:48 PM
12:09
това за sentry при липсващ pdf_url се оказа само един репорт
Today at 12:10:16 PM
12:10
същия го има като podcast и си работи
Today at 12:11:12 PM
12:11
Говорих със Стели да погледне някаква валидация в самия prophet
Today at 12:11:51 PM
12:11
ще го види още и ако трябва за бъдеше да направиме някакъв flow
Today at 12:12:01 PM
12:12
image.png
Toggle file
image.png
Galya Dimitrova
Today at 12:12:26 PM
12:12 PM
ок, ако е само един репорт може сега да го сетнем него на failed или нещо друго за да спре да спами сентри
Today at 12:12:33 PM
12:12
и да оставя тикета в беклога
Today at 12:12:34 PM
12:12
как мислиш
Lukas Kovalik
Today at 12:13:20 PM
12:13 PM
добре, да му кажа да не го гледа повече на Стели?
Today at 12:13:33 PM
12:13
или все пак да има за backlog
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:14:16 PM
12:14
да взема ли това със UP сега?
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:14:26 PM
12:14 PM
да го види за беклога. Ако нещо лесно измисли може и скоро да го направим
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:14:31 PM
12:14 PM
https://jiminny.atlassian.net/browse/JY-20773
https://jiminny.atlassian.net/browse/JY-20773
Jira Cloud
Jira Cloud
Remove preview
Jira Cloud Bug JY-20773 User Pilot not receiving events on report generated Bug JY-20773 in Jira Cloud Preview in Slack Status Backlog Priority Medium Medium Assignee Unassigned Unassigned As of today at 12:14 PM Refresh Open in Jira ✨ Summarise
User Pilot not receiving events on report generated
Bug JY-20773 in Jira Cloud
Preview in Slack
Status
Backlog
Priority
Medium
Assignee
Unassigned
As of today at 12:14 PM
Refresh
Open in Jira
✨ Summarise
Open in browser
Open
Share Bug JY-20773
View conversations
More actions
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:14:38 PM
12:14 PM
за това да пипнеш репорта да спре да гърми искаш ли тикет?
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:14:46 PM
12:14
иначе да, нека видим UP kкава му е драмата
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:15:31 PM
12:15 PM
ами ще напиша комент във съществуващ
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:22:18 PM
12:22 PM
Идеята ми е да спрем този репорт да се пробва да се праща и да спами сентри
.
А пък Стели вече ще гледа за фикс за бъдещи такива случаи
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:26:00 PM
12:26 PM
да разбрах, сега ще го маркирам като failed да не го взима следващия крон
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:26:14 PM
12:26 PM
ok
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:26:15 PM
12:26 PM
ако трябва да се пипне и в кода ще си направя тикет
1 reaction, react with +1 emoji
1
Add reaction…
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:26:41 PM
12:26 PM
малко ми е лудница тука между MCP i desktop aпа и какво ли още не и прескачам от чат на чат
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:27:25 PM
12:27 PM
разбира се и аз трябваше по-точно да го кажа
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:27:37 PM
12:27
ще ти пиша дали се оправило
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:29:38 PM
12:29 PM
А не
.
Ти сигурно ок си го казал ама чета по диагонал
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:29:53 PM
12:29
И другата седмица имаме презднтации пред борда в Лондон и съм до никъде
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Processing uploaded file… complete! Message ready to be sent.
loading…...
|
[{"role":"AXPopUpButton","text [{"role":"AXPopUpButton","text":"Switch workspaces… (Jiminny Inc) Has new messages","depth":14,"bounds":{"left":0.5056516,"top":0.058260176,"width":0.011968086,"height":0.028731046},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Home","depth":14,"bounds":{"left":0.50299203,"top":0.10055866,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Home","depth":16,"bounds":{"left":0.50664896,"top":0.13806863,"width":0.009973404,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"DMs","depth":14,"bounds":{"left":0.50299203,"top":0.15482841,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DMs","depth":16,"bounds":{"left":0.50764626,"top":0.19233839,"width":0.007978723,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Activity","depth":14,"bounds":{"left":0.50299203,"top":0.20909816,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Activity","depth":16,"bounds":{"left":0.5053192,"top":0.24660814,"width":0.012965426,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5053192,"top":0.24660814,"width":0.0026595744,"height":0.011173184}},{"char_start":1,"char_count":7,"bounds":{"left":0.50764626,"top":0.24660814,"width":0.010638298,"height":0.011173184}}],"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":14,"bounds":{"left":0.50299203,"top":0.26336792,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":16,"bounds":{"left":0.50797874,"top":0.3008779,"width":0.0076462766,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.50797874,"top":0.3008779,"width":0.0019946808,"height":0.011173184}},{"char_start":1,"char_count":4,"bounds":{"left":0.5099734,"top":0.3008779,"width":0.0056515955,"height":0.011173184}}],"role_description":"text"},{"role":"AXRadioButton","text":"Later","depth":14,"bounds":{"left":0.50299203,"top":0.31763768,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Later","depth":16,"bounds":{"left":0.50731385,"top":0.35514766,"width":0.008643617,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.50731385,"top":0.35514766,"width":0.0019946808,"height":0.011173184}},{"char_start":1,"char_count":4,"bounds":{"left":0.5093085,"top":0.35514766,"width":0.0066489363,"height":0.011173184}}],"role_description":"text"},{"role":"AXRadioButton","text":"More…","depth":14,"bounds":{"left":0.50299203,"top":0.3719074,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More","depth":16,"bounds":{"left":0.50731385,"top":0.4094174,"width":0.008976064,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.50731385,"top":0.4094174,"width":0.0033244682,"height":0.011173184}},{"char_start":1,"char_count":3,"bounds":{"left":0.5106383,"top":0.4094174,"width":0.0056515955,"height":0.011173184}}],"role_description":"text"},{"role":"AXStaticText","text":"Unreads","depth":21,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Threads","depth":21,"bounds":{"left":0.5369016,"top":0.09976058,"width":0.01761968,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5369016,"top":0.09976058,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.5398936,"top":0.09976058,"width":0.01462766,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Huddles","depth":21,"bounds":{"left":0.5369016,"top":0.12210695,"width":0.018284574,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5369016,"top":0.12210695,"width":0.0039893617,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.54089093,"top":0.12210695,"width":0.014295213,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Drafts & sent","depth":21,"bounds":{"left":0.5369016,"top":0.14445332,"width":0.02925532,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5369016,"top":0.14445332,"width":0.003656915,"height":0.014365523}},{"char_start":1,"char_count":12,"bounds":{"left":0.5405585,"top":0.14445332,"width":0.025265958,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"1","depth":21,"bounds":{"left":0.5884308,"top":0.1452514,"width":0.0026595744,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Directories","depth":21,"bounds":{"left":0.5369016,"top":0.16679968,"width":0.024268618,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5369016,"top":0.16679968,"width":0.0039893617,"height":0.014365523}},{"char_start":1,"char_count":10,"bounds":{"left":0.54089093,"top":0.16679968,"width":0.020279255,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"jiminny-x-integration-app","depth":23,"bounds":{"left":0.5422208,"top":0.26097366,"width":0.043882977,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.26097366,"width":0.0013297872,"height":0.014365523}},{"char_start":1,"char_count":24,"bounds":{"left":0.54355055,"top":0.26097366,"width":0.05418883,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"platform-inner-team","depth":23,"bounds":{"left":0.5422208,"top":0.28332004,"width":0.04454787,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.28332004,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":18,"bounds":{"left":0.54521275,"top":0.28332004,"width":0.04155585,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"ai-chapter","depth":23,"bounds":{"left":0.5422208,"top":0.33599362,"width":0.022273935,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.33599362,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":9,"bounds":{"left":0.54488033,"top":0.33599362,"width":0.019614361,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"alerts","depth":23,"bounds":{"left":0.5422208,"top":0.35834,"width":0.012300532,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.35834,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":5,"bounds":{"left":0.54488033,"top":0.35834,"width":0.00930851,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"backend","depth":23,"bounds":{"left":0.5422208,"top":0.38068634,"width":0.018284574,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.38068634,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.54521275,"top":0.38068634,"width":0.015292553,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"bugs","depth":23,"bounds":{"left":0.5422208,"top":0.40303272,"width":0.010638298,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.40303272,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":3,"bounds":{"left":0.54521275,"top":0.40303272,"width":0.00731383,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"confusion-clinic","depth":23,"bounds":{"left":0.5422208,"top":0.4253791,"width":0.034574468,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.4253791,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.54454786,"top":0.4253791,"width":0.032247342,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"curiosity_lab","depth":23,"bounds":{"left":0.5422208,"top":0.44772545,"width":0.027593086,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.44772545,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":12,"bounds":{"left":0.54454786,"top":0.44772545,"width":0.025265958,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"engineering","depth":23,"bounds":{"left":0.5422208,"top":0.47007182,"width":0.025930852,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.47007182,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":10,"bounds":{"left":0.54488033,"top":0.47007182,"width":0.022938829,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"general","depth":23,"bounds":{"left":0.5422208,"top":0.4924182,"width":0.016289894,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.4924182,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.54488033,"top":0.4924182,"width":0.013297873,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"jiminny-bg","depth":23,"bounds":{"left":0.5422208,"top":0.51476455,"width":0.023271276,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.51476455,"width":0.0013297872,"height":0.014365523}},{"char_start":1,"char_count":9,"bounds":{"left":0.54355055,"top":0.51476455,"width":0.021609042,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"platform-tickets","depth":23,"bounds":{"left":0.5422208,"top":0.5371109,"width":0.034906916,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.5371109,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.54521275,"top":0.5371109,"width":0.031914894,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"product_launches","depth":23,"bounds":{"left":0.5422208,"top":0.5594573,"width":0.03856383,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.5594573,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.54521275,"top":0.5594573,"width":0.03557181,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"random","depth":23,"bounds":{"left":0.5422208,"top":0.5818037,"width":0.016954787,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.5818037,"width":0.0019946808,"height":0.014365523}},{"char_start":1,"char_count":5,"bounds":{"left":0.54421544,"top":0.5818037,"width":0.014960106,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"releases","depth":23,"bounds":{"left":0.5422208,"top":0.60415006,"width":0.018284574,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.60415006,"width":0.0019946808,"height":0.014365523}},{"char_start":1,"char_count":7,"bounds":{"left":0.54421544,"top":0.60415006,"width":0.016289894,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"sofia-office","depth":23,"bounds":{"left":0.5422208,"top":0.62649643,"width":0.024601065,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.62649643,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":11,"bounds":{"left":0.54454786,"top":0.62649643,"width":0.021941489,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"support","depth":23,"bounds":{"left":0.5422208,"top":0.64884275,"width":0.017287234,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.64884275,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.54454786,"top":0.64884275,"width":0.01462766,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"thank-yous","depth":23,"bounds":{"left":0.5422208,"top":0.6711891,"width":0.024601065,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.6711891,"width":0.0019946808,"height":0.014365523}},{"char_start":1,"char_count":9,"bounds":{"left":0.54421544,"top":0.6711891,"width":0.022606382,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"the_people_of_jiminny","depth":23,"bounds":{"left":0.5422208,"top":0.6935355,"width":0.045212764,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.6935355,"width":0.0019946808,"height":0.014365523}},{"char_start":1,"char_count":20,"bounds":{"left":0.54421544,"top":0.6935355,"width":0.04720745,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Galya Dimitrova","depth":23,"bounds":{"left":0.5422208,"top":0.7462091,"width":0.03523936,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.7462091,"width":0.003656915,"height":0.014365523}},{"char_start":1,"char_count":14,"bounds":{"left":0.54587764,"top":0.7462091,"width":0.03158245,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":23,"bounds":{"left":0.5422208,"top":0.76855546,"width":0.038231384,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.76855546,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":16,"bounds":{"left":0.54488033,"top":0.76855546,"width":0.03557181,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Petko Kashinski","depth":23,"bounds":{"left":0.5422208,"top":0.79090184,"width":0.034574468,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.79090184,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":14,"bounds":{"left":0.54521275,"top":0.79090184,"width":0.03158245,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"bounds":{"left":0.5422208,"top":0.8132482,"width":0.03756649,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.8132482,"width":0.0033244682,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.5455452,"top":0.8132482,"width":0.034242023,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Stefka Stoyanova","depth":23,"bounds":{"left":0.5422208,"top":0.8355946,"width":0.037898935,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.8355946,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.54488033,"top":0.8355946,"width":0.03523936,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Vasil Vasilev","depth":23,"bounds":{"left":0.5422208,"top":0.8579409,"width":0.026595745,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.8579409,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":12,"bounds":{"left":0.54521275,"top":0.8579409,"width":0.023271276,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Ivanov","depth":23,"bounds":{"left":0.5422208,"top":0.8802873,"width":0.032247342,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.8802873,"width":0.0039893617,"height":0.014365523}},{"char_start":1,"char_count":13,"bounds":{"left":0.5462101,"top":0.8802873,"width":0.027925532,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"bounds":{"left":0.5422208,"top":0.90263367,"width":0.03756649,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.90263367,"width":0.0033244682,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.5455452,"top":0.90263367,"width":0.034242023,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"bounds":{"left":0.57978725,"top":0.90263367,"width":0.0063164895,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Yankov","depth":23,"bounds":{"left":0.58211434,"top":0.90263367,"width":0.014295213,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.58211434,"top":0.90263367,"width":0.0039893617,"height":0.014365523}},{"char_start":1,"char_count":13,"bounds":{"left":0.58610374,"top":0.90263367,"width":0.028922873,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Stoyan Tanev","depth":23,"bounds":{"left":0.5422208,"top":0.92498004,"width":0.028922873,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.92498004,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":11,"bounds":{"left":0.54488033,"top":0.92498004,"width":0.026263298,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Lukas Kovalik","depth":23,"bounds":{"left":0.5422208,"top":0.9473264,"width":0.029587766,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.9473264,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":12,"bounds":{"left":0.54488033,"top":0.9473264,"width":0.026928192,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"you","depth":23,"bounds":{"left":0.5744681,"top":0.9473264,"width":0.0063164895,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5744681,"top":0.9473264,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":2,"bounds":{"left":0.5767952,"top":0.9473264,"width":0.0056515955,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Jira Cloud","depth":23,"bounds":{"left":0.5422208,"top":0.9952115,"width":0.021941489,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Toast","depth":23,"bounds":{"left":0.5422208,"top":0.9952115,"width":0.011635638,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Google Calendar","depth":23,"bounds":{"left":0.5422208,"top":0.9952115,"width":0.030585106,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Messages","depth":17,"bounds":{"left":0.60206115,"top":0.09177973,"width":0.030917553,"height":0.030327214},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Messages","depth":19,"bounds":{"left":0.61136967,"top":0.10055866,"width":0.018949468,"height":0.012769354},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.61136967,"top":0.10055866,"width":0.0039893617,"height":0.012769354}},{"char_start":1,"char_count":7,"bounds":{"left":0.61535907,"top":0.10055866,"width":0.014960106,"height":0.012769354}}],"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":17,"bounds":{"left":0.63397604,"top":0.09177973,"width":0.020944148,"height":0.030327214},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":19,"bounds":{"left":0.64328456,"top":0.10055866,"width":0.008976064,"height":0.012769354},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.64328456,"top":0.10055866,"width":0.0026595744,"height":0.012769354}},{"char_start":1,"char_count":4,"bounds":{"left":0.6459442,"top":0.10055866,"width":0.0063164895,"height":0.012769354}}],"role_description":"text"},{"role":"AXRadioButton","text":"Untitled","depth":17,"bounds":{"left":0.65625,"top":0.09177973,"width":0.02925532,"height":0.030327214},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Untitled","depth":19,"bounds":{"left":0.6655585,"top":0.10055866,"width":0.015957447,"height":0.012769354},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.6655585,"top":0.10055866,"width":0.0033244682,"height":0.012769354}},{"char_start":1,"char_count":7,"bounds":{"left":0.66855055,"top":0.10055866,"width":0.012965426,"height":0.012769354}}],"role_description":"text"},{"role":"AXPopUpButton","text":"Add and Edit Channel Tabs","depth":17,"bounds":{"left":0.68650264,"top":0.09177973,"width":0.010970744,"height":0.030327214},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Canvas","depth":17,"bounds":{"left":0.59640956,"top":0.0518755,"width":0.015957447,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"List","depth":17,"bounds":{"left":0.59640956,"top":0.0518755,"width":0.007978723,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":17,"bounds":{"left":0.59640956,"top":0.0518755,"width":0.013962766,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXPopUpButton","text":"Jump to date","depth":23,"bounds":{"left":0.7849069,"top":0.12689546,"width":0.025265958,"height":0.022346368},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:08:38 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:08","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"този Планхат да ти кажа само проблеми с него","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:08:42 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:08","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"каквото и да се пробваш да правиш","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:09:04 PM","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:09 PM","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"да явно беше cache","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:09:48 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:09","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"това за sentry при липсващ pdf_url се оказа само един репорт","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:10:16 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:10","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"същия го има като podcast и си работи","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:11:12 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:11","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Говорих със Стели да погледне някаква валидация в самия prophet","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:11:51 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:11","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ще го види още и ако трябва за бъдеше да направиме някакъв flow","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:12:01 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:12","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"image.png","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Toggle file","depth":25,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXLink","text":"image.png","depth":27,"on_screen":false,"role_description":"Unlabelled image","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:12:26 PM","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:12 PM","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ок, ако е само един репорт може сега да го сетнем него на failed или нещо друго за да спре да спами сентри","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:12:33 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:12","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"и да оставя тикета в беклога","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:12:34 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:12","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"как мислиш","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:13:20 PM","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:13 PM","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"добре, да му кажа да не го гледа повече на Стели?","depth":25,"bounds":{"left":0.6180186,"top":0.11572227,"width":0.11735372,"height":0.013567438},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.6180186,"top":0.114924185,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":48,"bounds":{"left":0.62101066,"top":0.114924185,"width":0.1143617,"height":0.014365523}}],"role_description":"text"},{"role":"AXLink","text":"Today at 12:13:33 PM","depth":25,"bounds":{"left":0.6050532,"top":0.14126097,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:13","depth":26,"bounds":{"left":0.6050532,"top":0.14126097,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"или все пак да има за backlog","depth":25,"bounds":{"left":0.6180186,"top":0.13886672,"width":0.06781915,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:14:16 PM","depth":25,"bounds":{"left":0.6050532,"top":0.16520351,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14","depth":26,"bounds":{"left":0.6050532,"top":0.16520351,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"да взема ли това със UP сега?","depth":25,"bounds":{"left":0.6180186,"top":0.16280925,"width":0.068484046,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.18515563,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.1867518,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:14:26 PM","depth":24,"bounds":{"left":0.6569149,"top":0.18914606,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14 PM","depth":25,"bounds":{"left":0.6569149,"top":0.18914606,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"да го види за беклога. Ако нещо лесно измисли може и скоро да го направим","depth":25,"bounds":{"left":0.6180186,"top":0.20430966,"width":0.17985372,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.22665602,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.22825219,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:14:31 PM","depth":24,"bounds":{"left":0.6515958,"top":0.23064645,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14 PM","depth":25,"bounds":{"left":0.6515958,"top":0.23064645,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"https://jiminny.atlassian.net/browse/JY-20773","depth":25,"bounds":{"left":0.6180186,"top":0.24581006,"width":0.10106383,"height":0.014365523},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"https://jiminny.atlassian.net/browse/JY-20773","depth":26,"bounds":{"left":0.6180186,"top":0.24581006,"width":0.10106383,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Jira Cloud","depth":24,"bounds":{"left":0.6180186,"top":0.26895452,"width":0.018949468,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Jira Cloud","depth":24,"bounds":{"left":0.63829786,"top":0.26895452,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXButton","text":"Remove preview","depth":26,"bounds":{"left":0.61136967,"top":0.28731045,"width":0.0066489363,"height":0.016759777},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Jira Cloud Bug JY-20773 User Pilot not receiving events on report generated Bug JY-20773 in Jira Cloud Preview in Slack Status Backlog Priority Medium Medium Assignee Unassigned Unassigned As of today at 12:14 PM Refresh Open in Jira ✨ Summarise","depth":26,"bounds":{"left":0.6180186,"top":0.2857143,"width":0.15957446,"height":0.13727055},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"User Pilot not receiving events on report generated","depth":27,"bounds":{"left":0.63829786,"top":0.29928172,"width":0.11336436,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Bug JY-20773 in Jira Cloud","depth":28,"bounds":{"left":0.63829786,"top":0.31524342,"width":0.051861703,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Preview in Slack","depth":28,"bounds":{"left":0.63829786,"top":0.31524342,"width":0.03125,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Status","depth":27,"bounds":{"left":0.63829786,"top":0.33838788,"width":0.011968086,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Backlog","depth":27,"bounds":{"left":0.63962764,"top":0.3575419,"width":0.017287234,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Priority","depth":27,"bounds":{"left":0.6662234,"top":0.33838788,"width":0.013962766,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Medium","depth":27,"bounds":{"left":0.67420214,"top":0.3575419,"width":0.017952127,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Assignee","depth":27,"bounds":{"left":0.70146275,"top":0.33838788,"width":0.016954787,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Unassigned","depth":27,"bounds":{"left":0.7094415,"top":0.3575419,"width":0.025265958,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"As of today at 12:14 PM","depth":28,"bounds":{"left":0.62234044,"top":0.3982442,"width":0.046210106,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Refresh","depth":28,"bounds":{"left":0.66988033,"top":0.40143654,"width":0.01462766,"height":0.006384677},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Jira","depth":28,"bounds":{"left":0.7074468,"top":0.3934557,"width":0.030917553,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"✨ Summarise","depth":28,"bounds":{"left":0.7393617,"top":0.3934557,"width":0.03523936,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Open in browser","depth":27,"bounds":{"left":0.7144282,"top":0.29928172,"width":0.022606382,"height":0.025538707},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Open","depth":28,"bounds":{"left":0.7237367,"top":0.3048683,"width":0.010638298,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Share Bug JY-20773","depth":27,"bounds":{"left":0.7400266,"top":0.29928172,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View conversations","depth":27,"bounds":{"left":0.7506649,"top":0.29928172,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More actions","depth":27,"bounds":{"left":0.7613032,"top":0.29928172,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.43256184,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.43415803,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:14:38 PM","depth":24,"bounds":{"left":0.6569149,"top":0.4365523,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14 PM","depth":25,"bounds":{"left":0.6569149,"top":0.4365523,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"за това да пипнеш репорта да спре да гърми искаш ли тикет?","depth":25,"bounds":{"left":0.6180186,"top":0.4517159,"width":0.14261968,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:14:46 PM","depth":25,"bounds":{"left":0.6050532,"top":0.47805268,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14","depth":26,"bounds":{"left":0.6050532,"top":0.47805268,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"иначе да, нека видим UP kкава му е драмата","depth":25,"bounds":{"left":0.6180186,"top":0.47565842,"width":0.102726065,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.4980048,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.49960095,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:15:31 PM","depth":24,"bounds":{"left":0.6515958,"top":0.5019952,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:15 PM","depth":25,"bounds":{"left":0.6515958,"top":0.5019952,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ами ще напиша комент във съществуващ","depth":25,"bounds":{"left":0.6180186,"top":0.5171588,"width":0.095744684,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.90625,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.9168883,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.9275266,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.9381649,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.9488032,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.9594415,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.9700798,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.9807181,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.5395052,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.54110134,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:22:18 PM","depth":24,"bounds":{"left":0.6569149,"top":0.5434956,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:22 PM","depth":25,"bounds":{"left":0.6569149,"top":0.5434956,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Идеята ми е да спрем този репорт да се пробва да се праща и да спами сентри","depth":25,"bounds":{"left":0.6180186,"top":0.5586592,"width":0.18351063,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".","depth":25,"bounds":{"left":0.8011968,"top":0.5586592,"width":0.0013297872,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"А пък Стели вече ще гледа за фикс за бъдещи такива случаи","depth":25,"bounds":{"left":0.8025266,"top":0.5586592,"width":0.14162233,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.5810056,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.5826017,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:26:00 PM","depth":24,"bounds":{"left":0.6515958,"top":0.584996,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:26 PM","depth":25,"bounds":{"left":0.6515958,"top":0.584996,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"да разбрах, сега ще го маркирам като failed да не го взима следващия крон","depth":25,"bounds":{"left":0.6180186,"top":0.60015965,"width":0.17386968,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.62250596,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.6241022,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:26:14 PM","depth":24,"bounds":{"left":0.6569149,"top":0.62649643,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:26 PM","depth":25,"bounds":{"left":0.6569149,"top":0.62649643,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ok","depth":25,"bounds":{"left":0.6180186,"top":0.64166003,"width":0.0056515955,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.6640064,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.66560256,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:26:15 PM","depth":24,"bounds":{"left":0.6515958,"top":0.6679968,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:26 PM","depth":25,"bounds":{"left":0.6515958,"top":0.6679968,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ако трябва да се пипне и в кода ще си направя тикет","depth":25,"bounds":{"left":0.6180186,"top":0.6831604,"width":0.12167553,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"1 reaction, react with +1 emoji","depth":25,"bounds":{"left":0.6180186,"top":0.70231444,"width":0.014295213,"height":0.01915403},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":26,"bounds":{"left":0.62732714,"top":0.7055068,"width":0.0023271276,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Add reaction…","depth":25,"bounds":{"left":0.6336436,"top":0.70231444,"width":0.011303191,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.7310455,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.73264164,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:26:41 PM","depth":24,"bounds":{"left":0.6569149,"top":0.7350359,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:26 PM","depth":25,"bounds":{"left":0.6569149,"top":0.7350359,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"малко ми е лудница тука между MCP i desktop aпа и какво ли още не и прескачам от чат на чат","depth":25,"bounds":{"left":0.6180186,"top":0.7501995,"width":0.22074468,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.7725459,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.7741421,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:27:25 PM","depth":24,"bounds":{"left":0.6515958,"top":0.7765363,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:27 PM","depth":25,"bounds":{"left":0.6515958,"top":0.7765363,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"разбира се и аз трябваше по-точно да го кажа","depth":25,"bounds":{"left":0.6180186,"top":0.79169995,"width":0.10638298,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:27:37 PM","depth":25,"bounds":{"left":0.6050532,"top":0.81803674,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:27","depth":26,"bounds":{"left":0.6050532,"top":0.81803674,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ще ти пиша дали се оправило","depth":25,"bounds":{"left":0.6180186,"top":0.8156425,"width":0.06948138,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.83798885,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.839585,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:29:38 PM","depth":24,"bounds":{"left":0.6569149,"top":0.84197927,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:29 PM","depth":25,"bounds":{"left":0.6569149,"top":0.84197927,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"А не","depth":25,"bounds":{"left":0.6180186,"top":0.85714287,"width":0.010305851,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".","depth":25,"bounds":{"left":0.62799203,"top":0.85714287,"width":0.0013297872,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Ти сигурно ок си го казал ама чета по диагонал","depth":25,"bounds":{"left":0.6293218,"top":0.85714287,"width":0.11037234,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:29:53 PM","depth":25,"bounds":{"left":0.6050532,"top":0.88347965,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:29","depth":26,"bounds":{"left":0.6050532,"top":0.88347965,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"И другата седмица имаме презднтации пред борда в Лондон и съм до никъде","depth":25,"bounds":{"left":0.6180186,"top":0.8810854,"width":0.18218085,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"","depth":23,"bounds":{"left":0.6037234,"top":0.91380686,"width":0.38763297,"height":0.030327214},"on_screen":true,"value":"","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Processing uploaded file… complete! Message ready to be sent.","depth":11,"bounds":{"left":0.5,"top":0.9992019,"width":0.022938829,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"loading…","depth":11,"bounds":{"left":0.5,"top":0.9992019,"width":0.018949468,"height":0.0007980846},"on_screen":true,"role_description":"text"}]...
|
-8000585667208669092
|
-1285472209453266862
|
idle
|
hybrid
|
NULL
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Galya Dimitrova
Steliyan Georgiev
Petko Kashinski
Aneliya Angelova
Stefka Stoyanova
Vasil Vasilev
Nikolay Ivanov
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Lukas Kovalik
you
Jira Cloud
Toast
Google Calendar
Messages
Messages
Files
Files
Untitled
Untitled
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Today at 12:08:38 PM
12:08
този Планхат да ти кажа само проблеми с него
Today at 12:08:42 PM
12:08
каквото и да се пробваш да правиш
Lukas Kovalik
Today at 12:09:04 PM
12:09 PM
да явно беше cache
Today at 12:09:48 PM
12:09
това за sentry при липсващ pdf_url се оказа само един репорт
Today at 12:10:16 PM
12:10
същия го има като podcast и си работи
Today at 12:11:12 PM
12:11
Говорих със Стели да погледне някаква валидация в самия prophet
Today at 12:11:51 PM
12:11
ще го види още и ако трябва за бъдеше да направиме някакъв flow
Today at 12:12:01 PM
12:12
image.png
Toggle file
image.png
Galya Dimitrova
Today at 12:12:26 PM
12:12 PM
ок, ако е само един репорт може сега да го сетнем него на failed или нещо друго за да спре да спами сентри
Today at 12:12:33 PM
12:12
и да оставя тикета в беклога
Today at 12:12:34 PM
12:12
как мислиш
Lukas Kovalik
Today at 12:13:20 PM
12:13 PM
добре, да му кажа да не го гледа повече на Стели?
Today at 12:13:33 PM
12:13
или все пак да има за backlog
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:14:16 PM
12:14
да взема ли това със UP сега?
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:14:26 PM
12:14 PM
да го види за беклога. Ако нещо лесно измисли може и скоро да го направим
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:14:31 PM
12:14 PM
https://jiminny.atlassian.net/browse/JY-20773
https://jiminny.atlassian.net/browse/JY-20773
Jira Cloud
Jira Cloud
Remove preview
Jira Cloud Bug JY-20773 User Pilot not receiving events on report generated Bug JY-20773 in Jira Cloud Preview in Slack Status Backlog Priority Medium Medium Assignee Unassigned Unassigned As of today at 12:14 PM Refresh Open in Jira ✨ Summarise
User Pilot not receiving events on report generated
Bug JY-20773 in Jira Cloud
Preview in Slack
Status
Backlog
Priority
Medium
Assignee
Unassigned
As of today at 12:14 PM
Refresh
Open in Jira
✨ Summarise
Open in browser
Open
Share Bug JY-20773
View conversations
More actions
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:14:38 PM
12:14 PM
за това да пипнеш репорта да спре да гърми искаш ли тикет?
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:14:46 PM
12:14
иначе да, нека видим UP kкава му е драмата
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:15:31 PM
12:15 PM
ами ще напиша комент във съществуващ
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:22:18 PM
12:22 PM
Идеята ми е да спрем този репорт да се пробва да се праща и да спами сентри
.
А пък Стели вече ще гледа за фикс за бъдещи такива случаи
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:26:00 PM
12:26 PM
да разбрах, сега ще го маркирам като failed да не го взима следващия крон
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:26:14 PM
12:26 PM
ok
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:26:15 PM
12:26 PM
ако трябва да се пипне и в кода ще си направя тикет
1 reaction, react with +1 emoji
1
Add reaction…
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:26:41 PM
12:26 PM
малко ми е лудница тука между MCP i desktop aпа и какво ли още не и прескачам от чат на чат
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:27:25 PM
12:27 PM
разбира се и аз трябваше по-точно да го кажа
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:27:37 PM
12:27
ще ти пиша дали се оправило
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:29:38 PM
12:29 PM
А не
.
Ти сигурно ок си го казал ама чета по диагонал
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:29:53 PM
12:29
И другата седмица имаме презднтации пред борда в Лондон и съм до никъде
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Processing uploaded file… complete! Message ready to be sent.
loading…
slackEditVIewTypeError: League|Flysystem|FileCloudWatch | us-east-2G Jy 20820 es reindex stream mod(UY-20725) [HubSpot) Optimise CFJY-20725 add HS rate limit handlitPipelines - jiminny/app( Pull requests • jiminny/appWJY-207731 User Pilot not receivini( Jr-20773 fix user pilot tracking forJY-207761 Automated report - seP Platform Sorint 2 02 . Platform Te@JY-20625 | JY-20742 | MCP POCЬ— Data Exoloren* (UY-20776] Automated report - ser8 Jiminny• Jy-20725 add HS rate limit handlill(SRD-6793) Les Mills activity typePlatform Team - Backlog - JiraPtly-207791 Uiser Dilat not receivinJY-20773 fix user pilot trackin xPipelines - jiminny/app— New TabmistoryWindowHelp• github.com/jiminny/app/pull/12024jiminny / app &<> Code8? Pull requests 32( Agents • Actions L Wiki ® Security and quality 4InsightsLộ Settings@ On April 24 we'll start using GitHub Copilot interaction data for Al model training unless you opt out. Review this update and manage your preferences in your GitHub account settings.JY-20773 fix user pilot tracking for a#12024 •i7 OperLakyLak wants to merge 2 commits into master from JY-20f) Conversation• Commits 2|Fl, Checks3E FileLakvlak commented 2 weeks agoWritePreviewH B### JIRA: JY-20//3#### Chanaes.- Add SerializesModels trait as it seems the UP needs that forE LakyLak and others added 2 commits 2 weeks ago@ Jy-20773 fix user pilot tracking ofr automated repc@@Merge branch 'master' into JY-20773-fix-automated-sonaraubecloud Bot commented 7 minutes agol~ Quality Gate passedIssuesv O New issues0 Accepted issuesMeasuresv O Security Hotspots• U.0% Coverage on New Codev 0.0% Duplication on New CodeSee analvsis details on SonarQube CloudiHomeDMSActivityLaterMoreJiminny...ye Threadsд HuddlesDrafts & sent)DirectoriesAb External connections# Starred8 jiminny-x-integrati...platform-inner-team® Channels# ai-chapter# alerts# backend# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product launches# random# releases"sona-oince# supportt thank-vous# the_people_of jimi...• Direct messages%. Galya DimitrovaR. Steliyan Georgiev@ Dotko KochinckiRº. Aneliya AngelovaFA. Stefka Stoyanova€. Vasil Vasilev 1A Nikolay Ivanov(3) Aneliva Angelova....3 Stovan Taneve lukas Kovalk v::: Appssupoont Dally • In 1h 23m100% Lz• lue 1z May 13•3/:13Q Describe what you are looking for₫ . Galya DimitrovaMessagesr FilesUntitledTodayили все пак да има за backlogда взема ли това със UP cега?Galya Dimitrova 12:14 PMла го види за беклога. Ако нешо лесно измисли може и скоро ла го направимlukas Kovalk 12:14PMhttps://iiminnv.atlassian.net/browse/JY-20773Jira CloudUser Pilot not receiving events on report generatedBug JY-20773 in Jira CloudBacklog= Mediumg UnassignedAs of today at 12:14 PMOpen in Jiracalva Dimitrova 12:14 PMза това ла пипнеш репорта ла спое ла гьоми искаш ли тикет?иначе да, нека вилим UP kкава му е драматаLukas Kovalik 12:15PMами ше напиша комент във съществувашGalya Dimitrova 12-22 PMидеята ми е да спрем този репорт да се проова да се праща и да спами сентри. А пьк стели вече ще гледа за фикс за оъдещи такива случаиLukas Kovalik 12:26 PMда разбрах, сега ще го маркирам като failed да не го взима следващия кронGalya Dimitrova 12:26 PMLukas Kovalik 12:26 PMако трябва да се пипне и в кода ще си направя тикетGalya Dimitrova 12:26 PMмалко ми е лудница тука межлу MСР і desktop апа и какво ли още не и прескачам от чат на чатLukas Kovalik 12:27 PMразоира се и аз тояоваше по-точно да го кажаще ти пиша дали се оправилоGalya Dimitrova 12:29 PMА не. Ти сигурно ок си го казал ама чета по диагоналИ другата седмица имаме презднтации пред борда в Лондон и съм до никъдеMessage Galya Dimitrova+ Aa...
|
25027
|
NULL
|
NULL
|
NULL
|
|
25033
|
1053
|
0
|
2026-05-12T10:38:16.274892+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778582296274_m2.jpg...
|
Slack
|
Galya Dimitrova (DM) - Jiminny Inc - 4 new items - Galya Dimitrova (DM) - Jiminny Inc - 4 new items - Slack...
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Galya Dimitrova
Steliyan Georgiev
Petko Kashinski
Aneliya Angelova
Stefka Stoyanova
Vasil Vasilev
Nikolay Ivanov
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Lukas Kovalik
you
Jira Cloud
Toast
Google Calendar
Messages
Messages
Files
Files
Untitled
Untitled
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Today at 12:08:38 PM
12:08
този Планхат да ти кажа само проблеми с него
Today at 12:08:42 PM
12:08
каквото и да се пробваш да правиш
Lukas Kovalik
Today at 12:09:04 PM
12:09 PM
да явно беше cache
Today at 12:09:48 PM
12:09
това за sentry при липсващ pdf_url се оказа само един репорт
Today at 12:10:16 PM
12:10
същия го има като podcast и си работи
Today at 12:11:12 PM
12:11
Говорих със Стели да погледне някаква валидация в самия prophet
Today at 12:11:51 PM
12:11
ще го види още и ако трябва за бъдеше да направиме някакъв flow
Today at 12:12:01 PM
12:12
image.png
Toggle file
image.png
Galya Dimitrova
Today at 12:12:26 PM
12:12 PM
ок, ако е само един репорт може сега да го сетнем него на failed или нещо друго за да спре да спами сентри
Today at 12:12:33 PM
12:12
и да оставя тикета в беклога
Today at 12:12:34 PM
12:12
как мислиш
Lukas Kovalik
Today at 12:13:20 PM
12:13 PM
добре, да му кажа да не го гледа повече на Стели?
Today at 12:13:33 PM
12:13
или все пак да има за backlog
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:14:16 PM
12:14
да взема ли това със UP сега?
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:14:26 PM
12:14 PM
да го види за беклога. Ако нещо лесно измисли може и скоро да го направим
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:14:31 PM
12:14 PM
https://jiminny.atlassian.net/browse/JY-20773
https://jiminny.atlassian.net/browse/JY-20773
Jira Cloud
Jira Cloud
Remove preview
Jira Cloud Bug JY-20773 User Pilot not receiving events on report generated Bug JY-20773 in Jira Cloud Preview in Slack Status Backlog Priority Medium Medium Assignee Unassigned Unassigned As of today at 12:14 PM Refresh Open in Jira ✨ Summarise
User Pilot not receiving events on report generated
Bug JY-20773 in Jira Cloud
Preview in Slack
Status
Backlog
Priority
Medium
Assignee
Unassigned
As of today at 12:14 PM
Refresh
Open in Jira
✨ Summarise
Open in browser
Open
Share Bug JY-20773
View conversations
More actions
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:14:38 PM
12:14 PM
за това да пипнеш репорта да спре да гърми искаш ли тикет?
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:14:46 PM
12:14
иначе да, нека видим UP kкава му е драмата
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:15:31 PM
12:15 PM
ами ще напиша комент във съществуващ
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:22:18 PM
12:22 PM
Идеята ми е да спрем този репорт да се пробва да се праща и да спами сентри
.
А пък Стели вече ще гледа за фикс за бъдещи такива случаи
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:26:00 PM
12:26 PM
да разбрах, сега ще го маркирам като failed да не го взима следващия крон
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:26:14 PM
12:26 PM
ok
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:26:15 PM
12:26 PM
ако трябва да се пипне и в кода ще си направя тикет
1 reaction, react with +1 emoji
1
Add reaction…
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:26:41 PM
12:26 PM
малко ми е лудница тука между MCP i desktop aпа и какво ли още не и прескачам от чат на чат
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:27:25 PM
12:27 PM
разбира се и аз трябваше по-точно да го кажа
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:27:37 PM
12:27
ще ти пиша дали се оправило
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:29:38 PM
12:29 PM
А не
.
Ти сигурно ок си го казал ама чета по диагонал
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:29:53 PM
12:29
И другата седмица имаме презднтации пред борда в Лондон и съм до никъде
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Processing uploaded file… complete! Message ready to be sent.
loading…...
|
[{"role":"AXPopUpButton","text [{"role":"AXPopUpButton","text":"Switch workspaces… (Jiminny Inc) Has new messages","depth":14,"bounds":{"left":0.5056516,"top":0.058260176,"width":0.011968086,"height":0.028731046},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Home","depth":14,"bounds":{"left":0.50299203,"top":0.10055866,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Home","depth":16,"bounds":{"left":0.50664896,"top":0.13806863,"width":0.009973404,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"DMs","depth":14,"bounds":{"left":0.50299203,"top":0.15482841,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DMs","depth":16,"bounds":{"left":0.50764626,"top":0.19233839,"width":0.007978723,"height":0.0103751},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Activity","depth":14,"bounds":{"left":0.50299203,"top":0.20909816,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Activity","depth":16,"bounds":{"left":0.5053192,"top":0.24660814,"width":0.012965426,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5053192,"top":0.24660814,"width":0.0026595744,"height":0.011173184}},{"char_start":1,"char_count":7,"bounds":{"left":0.50764626,"top":0.24660814,"width":0.010638298,"height":0.011173184}}],"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":14,"bounds":{"left":0.50299203,"top":0.26336792,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":16,"bounds":{"left":0.50797874,"top":0.3008779,"width":0.0076462766,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.50797874,"top":0.3008779,"width":0.0019946808,"height":0.011173184}},{"char_start":1,"char_count":4,"bounds":{"left":0.5099734,"top":0.3008779,"width":0.0056515955,"height":0.011173184}}],"role_description":"text"},{"role":"AXRadioButton","text":"Later","depth":14,"bounds":{"left":0.50299203,"top":0.31763768,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Later","depth":16,"bounds":{"left":0.50731385,"top":0.35514766,"width":0.008643617,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.50731385,"top":0.35514766,"width":0.0019946808,"height":0.011173184}},{"char_start":1,"char_count":4,"bounds":{"left":0.5093085,"top":0.35514766,"width":0.0066489363,"height":0.011173184}}],"role_description":"text"},{"role":"AXRadioButton","text":"More…","depth":14,"bounds":{"left":0.50299203,"top":0.3719074,"width":0.017287234,"height":0.054269753},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More","depth":16,"bounds":{"left":0.50731385,"top":0.4094174,"width":0.008976064,"height":0.0103751},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.50731385,"top":0.4094174,"width":0.0033244682,"height":0.011173184}},{"char_start":1,"char_count":3,"bounds":{"left":0.5106383,"top":0.4094174,"width":0.0056515955,"height":0.011173184}}],"role_description":"text"},{"role":"AXStaticText","text":"Unreads","depth":21,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Threads","depth":21,"bounds":{"left":0.5369016,"top":0.09976058,"width":0.01761968,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5369016,"top":0.09976058,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.5398936,"top":0.09976058,"width":0.01462766,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Huddles","depth":21,"bounds":{"left":0.5369016,"top":0.12210695,"width":0.018284574,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5369016,"top":0.12210695,"width":0.0039893617,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.54089093,"top":0.12210695,"width":0.014295213,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Drafts & sent","depth":21,"bounds":{"left":0.5369016,"top":0.14445332,"width":0.02925532,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5369016,"top":0.14445332,"width":0.003656915,"height":0.014365523}},{"char_start":1,"char_count":12,"bounds":{"left":0.5405585,"top":0.14445332,"width":0.025265958,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"1","depth":21,"bounds":{"left":0.5884308,"top":0.1452514,"width":0.0026595744,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Directories","depth":21,"bounds":{"left":0.5369016,"top":0.16679968,"width":0.024268618,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5369016,"top":0.16679968,"width":0.0039893617,"height":0.014365523}},{"char_start":1,"char_count":10,"bounds":{"left":0.54089093,"top":0.16679968,"width":0.020279255,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"jiminny-x-integration-app","depth":23,"bounds":{"left":0.5422208,"top":0.26097366,"width":0.043882977,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.26097366,"width":0.0013297872,"height":0.014365523}},{"char_start":1,"char_count":24,"bounds":{"left":0.54355055,"top":0.26097366,"width":0.05418883,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"platform-inner-team","depth":23,"bounds":{"left":0.5422208,"top":0.28332004,"width":0.04454787,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.28332004,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":18,"bounds":{"left":0.54521275,"top":0.28332004,"width":0.04155585,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"ai-chapter","depth":23,"bounds":{"left":0.5422208,"top":0.33599362,"width":0.022273935,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.33599362,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":9,"bounds":{"left":0.54488033,"top":0.33599362,"width":0.019614361,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"alerts","depth":23,"bounds":{"left":0.5422208,"top":0.35834,"width":0.012300532,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.35834,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":5,"bounds":{"left":0.54488033,"top":0.35834,"width":0.00930851,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"backend","depth":23,"bounds":{"left":0.5422208,"top":0.38068634,"width":0.018284574,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.38068634,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.54521275,"top":0.38068634,"width":0.015292553,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"bugs","depth":23,"bounds":{"left":0.5422208,"top":0.40303272,"width":0.010638298,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.40303272,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":3,"bounds":{"left":0.54521275,"top":0.40303272,"width":0.00731383,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"confusion-clinic","depth":23,"bounds":{"left":0.5422208,"top":0.4253791,"width":0.034574468,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.4253791,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.54454786,"top":0.4253791,"width":0.032247342,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"curiosity_lab","depth":23,"bounds":{"left":0.5422208,"top":0.44772545,"width":0.027593086,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.44772545,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":12,"bounds":{"left":0.54454786,"top":0.44772545,"width":0.025265958,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"engineering","depth":23,"bounds":{"left":0.5422208,"top":0.47007182,"width":0.025930852,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.47007182,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":10,"bounds":{"left":0.54488033,"top":0.47007182,"width":0.022938829,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"general","depth":23,"bounds":{"left":0.5422208,"top":0.4924182,"width":0.016289894,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.4924182,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.54488033,"top":0.4924182,"width":0.013297873,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"jiminny-bg","depth":23,"bounds":{"left":0.5422208,"top":0.51476455,"width":0.023271276,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.51476455,"width":0.0013297872,"height":0.014365523}},{"char_start":1,"char_count":9,"bounds":{"left":0.54355055,"top":0.51476455,"width":0.021609042,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"platform-tickets","depth":23,"bounds":{"left":0.5422208,"top":0.5371109,"width":0.034906916,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.5371109,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.54521275,"top":0.5371109,"width":0.031914894,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"product_launches","depth":23,"bounds":{"left":0.5422208,"top":0.5594573,"width":0.03856383,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.5594573,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.54521275,"top":0.5594573,"width":0.03557181,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"random","depth":23,"bounds":{"left":0.5422208,"top":0.5818037,"width":0.016954787,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.5818037,"width":0.0019946808,"height":0.014365523}},{"char_start":1,"char_count":5,"bounds":{"left":0.54421544,"top":0.5818037,"width":0.014960106,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"releases","depth":23,"bounds":{"left":0.5422208,"top":0.60415006,"width":0.018284574,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.60415006,"width":0.0019946808,"height":0.014365523}},{"char_start":1,"char_count":7,"bounds":{"left":0.54421544,"top":0.60415006,"width":0.016289894,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"sofia-office","depth":23,"bounds":{"left":0.5422208,"top":0.62649643,"width":0.024601065,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.62649643,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":11,"bounds":{"left":0.54454786,"top":0.62649643,"width":0.021941489,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"support","depth":23,"bounds":{"left":0.5422208,"top":0.64884275,"width":0.017287234,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.64884275,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":6,"bounds":{"left":0.54454786,"top":0.64884275,"width":0.01462766,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"thank-yous","depth":23,"bounds":{"left":0.5422208,"top":0.6711891,"width":0.024601065,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.6711891,"width":0.0019946808,"height":0.014365523}},{"char_start":1,"char_count":9,"bounds":{"left":0.54421544,"top":0.6711891,"width":0.022606382,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"the_people_of_jiminny","depth":23,"bounds":{"left":0.5422208,"top":0.6935355,"width":0.045212764,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.6935355,"width":0.0019946808,"height":0.014365523}},{"char_start":1,"char_count":20,"bounds":{"left":0.54421544,"top":0.6935355,"width":0.04720745,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Galya Dimitrova","depth":23,"bounds":{"left":0.5422208,"top":0.7462091,"width":0.03523936,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.7462091,"width":0.003656915,"height":0.014365523}},{"char_start":1,"char_count":14,"bounds":{"left":0.54587764,"top":0.7462091,"width":0.03158245,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":23,"bounds":{"left":0.5422208,"top":0.76855546,"width":0.038231384,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.76855546,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":16,"bounds":{"left":0.54488033,"top":0.76855546,"width":0.03557181,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Petko Kashinski","depth":23,"bounds":{"left":0.5422208,"top":0.79090184,"width":0.034574468,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.79090184,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":14,"bounds":{"left":0.54521275,"top":0.79090184,"width":0.03158245,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"bounds":{"left":0.5422208,"top":0.8132482,"width":0.03756649,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.8132482,"width":0.0033244682,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.5455452,"top":0.8132482,"width":0.034242023,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Stefka Stoyanova","depth":23,"bounds":{"left":0.5422208,"top":0.8355946,"width":0.037898935,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.8355946,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.54488033,"top":0.8355946,"width":0.03523936,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Vasil Vasilev","depth":23,"bounds":{"left":0.5422208,"top":0.8579409,"width":0.026595745,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.8579409,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":12,"bounds":{"left":0.54521275,"top":0.8579409,"width":0.023271276,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Ivanov","depth":23,"bounds":{"left":0.5422208,"top":0.8802873,"width":0.032247342,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.8802873,"width":0.0039893617,"height":0.014365523}},{"char_start":1,"char_count":13,"bounds":{"left":0.5462101,"top":0.8802873,"width":0.027925532,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":23,"bounds":{"left":0.5422208,"top":0.90263367,"width":0.03756649,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.90263367,"width":0.0033244682,"height":0.014365523}},{"char_start":1,"char_count":15,"bounds":{"left":0.5455452,"top":0.90263367,"width":0.034242023,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"bounds":{"left":0.57978725,"top":0.90263367,"width":0.0063164895,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Yankov","depth":23,"bounds":{"left":0.58211434,"top":0.90263367,"width":0.014295213,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.58211434,"top":0.90263367,"width":0.0039893617,"height":0.014365523}},{"char_start":1,"char_count":13,"bounds":{"left":0.58610374,"top":0.90263367,"width":0.028922873,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":",","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":23,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Stoyan Tanev","depth":23,"bounds":{"left":0.5422208,"top":0.92498004,"width":0.028922873,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.92498004,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":11,"bounds":{"left":0.54488033,"top":0.92498004,"width":0.026263298,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Lukas Kovalik","depth":23,"bounds":{"left":0.5422208,"top":0.9473264,"width":0.029587766,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5422208,"top":0.9473264,"width":0.0026595744,"height":0.014365523}},{"char_start":1,"char_count":12,"bounds":{"left":0.54488033,"top":0.9473264,"width":0.026928192,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"you","depth":23,"bounds":{"left":0.5744681,"top":0.9473264,"width":0.0063164895,"height":0.014365523},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.5744681,"top":0.9473264,"width":0.0023271276,"height":0.014365523}},{"char_start":1,"char_count":2,"bounds":{"left":0.5767952,"top":0.9473264,"width":0.0056515955,"height":0.014365523}}],"role_description":"text"},{"role":"AXStaticText","text":"Jira Cloud","depth":23,"bounds":{"left":0.5422208,"top":0.9952115,"width":0.021941489,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Toast","depth":23,"bounds":{"left":0.5422208,"top":0.9952115,"width":0.011635638,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Google Calendar","depth":23,"bounds":{"left":0.5422208,"top":0.9952115,"width":0.030585106,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXRadioButton","text":"Messages","depth":17,"bounds":{"left":0.60206115,"top":0.09177973,"width":0.030917553,"height":0.030327214},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Messages","depth":19,"bounds":{"left":0.61136967,"top":0.10055866,"width":0.018949468,"height":0.012769354},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.61136967,"top":0.10055866,"width":0.0039893617,"height":0.012769354}},{"char_start":1,"char_count":7,"bounds":{"left":0.61535907,"top":0.10055866,"width":0.014960106,"height":0.012769354}}],"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":17,"bounds":{"left":0.63397604,"top":0.09177973,"width":0.020944148,"height":0.030327214},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":19,"bounds":{"left":0.64328456,"top":0.10055866,"width":0.008976064,"height":0.012769354},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.64328456,"top":0.10055866,"width":0.0026595744,"height":0.012769354}},{"char_start":1,"char_count":4,"bounds":{"left":0.6459442,"top":0.10055866,"width":0.0063164895,"height":0.012769354}}],"role_description":"text"},{"role":"AXRadioButton","text":"Untitled","depth":17,"bounds":{"left":0.65625,"top":0.09177973,"width":0.02925532,"height":0.030327214},"on_screen":true,"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Untitled","depth":19,"bounds":{"left":0.6655585,"top":0.10055866,"width":0.015957447,"height":0.012769354},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.6655585,"top":0.10055866,"width":0.0033244682,"height":0.012769354}},{"char_start":1,"char_count":7,"bounds":{"left":0.66855055,"top":0.10055866,"width":0.012965426,"height":0.012769354}}],"role_description":"text"},{"role":"AXPopUpButton","text":"Add and Edit Channel Tabs","depth":17,"bounds":{"left":0.68650264,"top":0.09177973,"width":0.010970744,"height":0.030327214},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Canvas","depth":17,"bounds":{"left":0.59640956,"top":0.0518755,"width":0.015957447,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"List","depth":17,"bounds":{"left":0.59640956,"top":0.0518755,"width":0.007978723,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":17,"bounds":{"left":0.59640956,"top":0.0518755,"width":0.013962766,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXPopUpButton","text":"Jump to date","depth":23,"bounds":{"left":0.7849069,"top":0.12689546,"width":0.025265958,"height":0.022346368},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:08:38 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:08","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"този Планхат да ти кажа само проблеми с него","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:08:42 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:08","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"каквото и да се пробваш да правиш","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:09:04 PM","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:09 PM","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"да явно беше cache","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:09:48 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:09","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"това за sentry при липсващ pdf_url се оказа само един репорт","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:10:16 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:10","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"същия го има като podcast и си работи","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:11:12 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:11","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Говорих със Стели да погледне някаква валидация в самия prophet","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:11:51 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:11","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ще го види още и ако трябва за бъдеше да направиме някакъв flow","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:12:01 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:12","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"image.png","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Toggle file","depth":25,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXLink","text":"image.png","depth":27,"on_screen":false,"role_description":"Unlabelled image","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:12:26 PM","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:12 PM","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ок, ако е само един репорт може сега да го сетнем него на failed или нещо друго за да спре да спами сентри","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:12:33 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:12","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"и да оставя тикета в беклога","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:12:34 PM","depth":25,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:12","depth":26,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"как мислиш","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"on_screen":false,"role_description":"text"},{"role":"AXLink","text":"Today at 12:13:20 PM","depth":24,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:13 PM","depth":25,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"добре, да му кажа да не го гледа повече на Стели?","depth":25,"bounds":{"left":0.6180186,"top":0.11572227,"width":0.11735372,"height":0.013567438},"on_screen":true,"lines":[{"char_start":0,"char_count":1,"bounds":{"left":0.6180186,"top":0.114924185,"width":0.0029920214,"height":0.014365523}},{"char_start":1,"char_count":48,"bounds":{"left":0.62101066,"top":0.114924185,"width":0.1143617,"height":0.014365523}}],"role_description":"text"},{"role":"AXLink","text":"Today at 12:13:33 PM","depth":25,"bounds":{"left":0.6050532,"top":0.14126097,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:13","depth":26,"bounds":{"left":0.6050532,"top":0.14126097,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"или все пак да има за backlog","depth":25,"bounds":{"left":0.6180186,"top":0.13886672,"width":0.06781915,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:14:16 PM","depth":25,"bounds":{"left":0.6050532,"top":0.16520351,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14","depth":26,"bounds":{"left":0.6050532,"top":0.16520351,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"да взема ли това със UP сега?","depth":25,"bounds":{"left":0.6180186,"top":0.16280925,"width":0.068484046,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.18515563,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.1867518,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:14:26 PM","depth":24,"bounds":{"left":0.6569149,"top":0.18914606,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14 PM","depth":25,"bounds":{"left":0.6569149,"top":0.18914606,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"да го види за беклога. Ако нещо лесно измисли може и скоро да го направим","depth":25,"bounds":{"left":0.6180186,"top":0.20430966,"width":0.17985372,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.22665602,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.22825219,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:14:31 PM","depth":24,"bounds":{"left":0.6515958,"top":0.23064645,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14 PM","depth":25,"bounds":{"left":0.6515958,"top":0.23064645,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"https://jiminny.atlassian.net/browse/JY-20773","depth":25,"bounds":{"left":0.6180186,"top":0.24581006,"width":0.10106383,"height":0.014365523},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"https://jiminny.atlassian.net/browse/JY-20773","depth":26,"bounds":{"left":0.6180186,"top":0.24581006,"width":0.10106383,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Jira Cloud","depth":24,"bounds":{"left":0.6180186,"top":0.26895452,"width":0.018949468,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Jira Cloud","depth":24,"bounds":{"left":0.63829786,"top":0.26895452,"width":0.005319149,"height":0.012769354},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXButton","text":"Remove preview","depth":26,"bounds":{"left":0.61136967,"top":0.28731045,"width":0.0066489363,"height":0.016759777},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Jira Cloud Bug JY-20773 User Pilot not receiving events on report generated Bug JY-20773 in Jira Cloud Preview in Slack Status Backlog Priority Medium Medium Assignee Unassigned Unassigned As of today at 12:14 PM Refresh Open in Jira ✨ Summarise","depth":26,"bounds":{"left":0.6180186,"top":0.2857143,"width":0.15957446,"height":0.13727055},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"User Pilot not receiving events on report generated","depth":27,"bounds":{"left":0.63829786,"top":0.29928172,"width":0.11336436,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Bug JY-20773 in Jira Cloud","depth":28,"bounds":{"left":0.63829786,"top":0.31524342,"width":0.051861703,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Preview in Slack","depth":28,"bounds":{"left":0.63829786,"top":0.31524342,"width":0.03125,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Status","depth":27,"bounds":{"left":0.63829786,"top":0.33838788,"width":0.011968086,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Backlog","depth":27,"bounds":{"left":0.63962764,"top":0.3575419,"width":0.017287234,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Priority","depth":27,"bounds":{"left":0.6662234,"top":0.33838788,"width":0.013962766,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Medium","depth":27,"bounds":{"left":0.67420214,"top":0.3575419,"width":0.017952127,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Assignee","depth":27,"bounds":{"left":0.70146275,"top":0.33838788,"width":0.016954787,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Unassigned","depth":27,"bounds":{"left":0.7094415,"top":0.3575419,"width":0.025265958,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"As of today at 12:14 PM","depth":28,"bounds":{"left":0.62234044,"top":0.3982442,"width":0.046210106,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Refresh","depth":28,"bounds":{"left":0.66988033,"top":0.40143654,"width":0.01462766,"height":0.006384677},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Jira","depth":28,"bounds":{"left":0.7074468,"top":0.3934557,"width":0.030917553,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"✨ Summarise","depth":28,"bounds":{"left":0.7393617,"top":0.3934557,"width":0.03523936,"height":0.022346368},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Open in browser","depth":27,"bounds":{"left":0.7144282,"top":0.29928172,"width":0.022606382,"height":0.025538707},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Open","depth":28,"bounds":{"left":0.7237367,"top":0.3048683,"width":0.010638298,"height":0.012769354},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Share Bug JY-20773","depth":27,"bounds":{"left":0.7400266,"top":0.29928172,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View conversations","depth":27,"bounds":{"left":0.7506649,"top":0.29928172,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More actions","depth":27,"bounds":{"left":0.7613032,"top":0.29928172,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.43256184,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.43415803,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:14:38 PM","depth":24,"bounds":{"left":0.6569149,"top":0.4365523,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14 PM","depth":25,"bounds":{"left":0.6569149,"top":0.4365523,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"за това да пипнеш репорта да спре да гърми искаш ли тикет?","depth":25,"bounds":{"left":0.6180186,"top":0.4517159,"width":0.14261968,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:14:46 PM","depth":25,"bounds":{"left":0.6050532,"top":0.47805268,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:14","depth":26,"bounds":{"left":0.6050532,"top":0.47805268,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"иначе да, нека видим UP kкава му е драмата","depth":25,"bounds":{"left":0.6180186,"top":0.47565842,"width":0.102726065,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.4980048,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.49960095,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:15:31 PM","depth":24,"bounds":{"left":0.6515958,"top":0.5019952,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:15 PM","depth":25,"bounds":{"left":0.6515958,"top":0.5019952,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ами ще напиша комент във съществуващ","depth":25,"bounds":{"left":0.6180186,"top":0.5171588,"width":0.095744684,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"bounds":{"left":0.90625,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"bounds":{"left":0.9168883,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"bounds":{"left":0.9275266,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"bounds":{"left":0.9381649,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"bounds":{"left":0.9488032,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"bounds":{"left":0.9594415,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"bounds":{"left":0.9700798,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"bounds":{"left":0.9807181,"top":0.48523542,"width":0.010638298,"height":0.025538707},"on_screen":true,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.5395052,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.54110134,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:22:18 PM","depth":24,"bounds":{"left":0.6569149,"top":0.5434956,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:22 PM","depth":25,"bounds":{"left":0.6569149,"top":0.5434956,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Идеята ми е да спрем този репорт да се пробва да се праща и да спами сентри","depth":25,"bounds":{"left":0.6180186,"top":0.5586592,"width":0.18351063,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".","depth":25,"bounds":{"left":0.8011968,"top":0.5586592,"width":0.0013297872,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"А пък Стели вече ще гледа за фикс за бъдещи такива случаи","depth":25,"bounds":{"left":0.8025266,"top":0.5586592,"width":0.14162233,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.5810056,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.5826017,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:26:00 PM","depth":24,"bounds":{"left":0.6515958,"top":0.584996,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:26 PM","depth":25,"bounds":{"left":0.6515958,"top":0.584996,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"да разбрах, сега ще го маркирам като failed да не го взима следващия крон","depth":25,"bounds":{"left":0.6180186,"top":0.60015965,"width":0.17386968,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.62250596,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.6241022,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:26:14 PM","depth":24,"bounds":{"left":0.6569149,"top":0.62649643,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:26 PM","depth":25,"bounds":{"left":0.6569149,"top":0.62649643,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ok","depth":25,"bounds":{"left":0.6180186,"top":0.64166003,"width":0.0056515955,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.6640064,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.66560256,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:26:15 PM","depth":24,"bounds":{"left":0.6515958,"top":0.6679968,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:26 PM","depth":25,"bounds":{"left":0.6515958,"top":0.6679968,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ако трябва да се пипне и в кода ще си направя тикет","depth":25,"bounds":{"left":0.6180186,"top":0.6831604,"width":0.12167553,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"1 reaction, react with +1 emoji","depth":25,"bounds":{"left":0.6180186,"top":0.70231444,"width":0.014295213,"height":0.01915403},"on_screen":true,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":26,"bounds":{"left":0.62732714,"top":0.7055068,"width":0.0023271276,"height":0.011971269},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Add reaction…","depth":25,"bounds":{"left":0.6336436,"top":0.70231444,"width":0.011303191,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.7310455,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.73264164,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:26:41 PM","depth":24,"bounds":{"left":0.6569149,"top":0.7350359,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:26 PM","depth":25,"bounds":{"left":0.6569149,"top":0.7350359,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"малко ми е лудница тука между MCP i desktop aпа и какво ли още не и прескачам от чат на чат","depth":25,"bounds":{"left":0.6180186,"top":0.7501995,"width":0.22074468,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.6180186,"top":0.7725459,"width":0.030917553,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.64893615,"top":0.7741421,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:27:25 PM","depth":24,"bounds":{"left":0.6515958,"top":0.7765363,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:27 PM","depth":25,"bounds":{"left":0.6515958,"top":0.7765363,"width":0.017287234,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"разбира се и аз трябваше по-точно да го кажа","depth":25,"bounds":{"left":0.6180186,"top":0.79169995,"width":0.10638298,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:27:37 PM","depth":25,"bounds":{"left":0.6050532,"top":0.81803674,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:27","depth":26,"bounds":{"left":0.6050532,"top":0.81803674,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ще ти пиша дали се оправило","depth":25,"bounds":{"left":0.6180186,"top":0.8156425,"width":0.06948138,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"bounds":{"left":0.6180186,"top":0.83798885,"width":0.03656915,"height":0.017557861},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.65425533,"top":0.839585,"width":0.0026595744,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXLink","text":"Today at 12:29:38 PM","depth":24,"bounds":{"left":0.6569149,"top":0.84197927,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:29 PM","depth":25,"bounds":{"left":0.6569149,"top":0.84197927,"width":0.01761968,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"А не","depth":25,"bounds":{"left":0.6180186,"top":0.85714287,"width":0.010305851,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".","depth":25,"bounds":{"left":0.62799203,"top":0.85714287,"width":0.0013297872,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Ти сигурно ок си го казал ама чета по диагонал","depth":25,"bounds":{"left":0.6293218,"top":0.85714287,"width":0.11037234,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Today at 12:29:53 PM","depth":25,"bounds":{"left":0.6050532,"top":0.88347965,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"12:29","depth":26,"bounds":{"left":0.6050532,"top":0.88347965,"width":0.010305851,"height":0.011173184},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"И другата седмица имаме презднтации пред борда в Лондон и съм до никъде","depth":25,"bounds":{"left":0.6180186,"top":0.8810854,"width":0.18218085,"height":0.014365523},"on_screen":true,"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"on_screen":false,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"on_screen":false,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"","depth":23,"bounds":{"left":0.6037234,"top":0.91380686,"width":0.38763297,"height":0.030327214},"on_screen":true,"value":"","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Processing uploaded file… complete! Message ready to be sent.","depth":11,"bounds":{"left":0.5,"top":0.9992019,"width":0.022938829,"height":0.0007980846},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"loading…","depth":11,"bounds":{"left":0.5,"top":0.9992019,"width":0.018949468,"height":0.0007980846},"on_screen":true,"role_description":"text"}]...
|
-8000585667208669092
|
-1285472209453266862
|
idle
|
hybrid
|
NULL
|
Switch workspaces… (Jiminny Inc) Has new messages
Switch workspaces… (Jiminny Inc) Has new messages
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
1
Directories
jiminny-x-integration-app
platform-inner-team
ai-chapter
alerts
backend
bugs
confusion-clinic
curiosity_lab
engineering
general
jiminny-bg
platform-tickets
product_launches
random
releases
sofia-office
support
thank-yous
the_people_of_jiminny
Galya Dimitrova
Steliyan Georgiev
Petko Kashinski
Aneliya Angelova
Stefka Stoyanova
Vasil Vasilev
Nikolay Ivanov
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Stoyan Tanev
Lukas Kovalik
you
Jira Cloud
Toast
Google Calendar
Messages
Messages
Files
Files
Untitled
Untitled
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Today at 12:08:38 PM
12:08
този Планхат да ти кажа само проблеми с него
Today at 12:08:42 PM
12:08
каквото и да се пробваш да правиш
Lukas Kovalik
Today at 12:09:04 PM
12:09 PM
да явно беше cache
Today at 12:09:48 PM
12:09
това за sentry при липсващ pdf_url се оказа само един репорт
Today at 12:10:16 PM
12:10
същия го има като podcast и си работи
Today at 12:11:12 PM
12:11
Говорих със Стели да погледне някаква валидация в самия prophet
Today at 12:11:51 PM
12:11
ще го види още и ако трябва за бъдеше да направиме някакъв flow
Today at 12:12:01 PM
12:12
image.png
Toggle file
image.png
Galya Dimitrova
Today at 12:12:26 PM
12:12 PM
ок, ако е само един репорт може сега да го сетнем него на failed или нещо друго за да спре да спами сентри
Today at 12:12:33 PM
12:12
и да оставя тикета в беклога
Today at 12:12:34 PM
12:12
как мислиш
Lukas Kovalik
Today at 12:13:20 PM
12:13 PM
добре, да му кажа да не го гледа повече на Стели?
Today at 12:13:33 PM
12:13
или все пак да има за backlog
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:14:16 PM
12:14
да взема ли това със UP сега?
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:14:26 PM
12:14 PM
да го види за беклога. Ако нещо лесно измисли може и скоро да го направим
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:14:31 PM
12:14 PM
https://jiminny.atlassian.net/browse/JY-20773
https://jiminny.atlassian.net/browse/JY-20773
Jira Cloud
Jira Cloud
Remove preview
Jira Cloud Bug JY-20773 User Pilot not receiving events on report generated Bug JY-20773 in Jira Cloud Preview in Slack Status Backlog Priority Medium Medium Assignee Unassigned Unassigned As of today at 12:14 PM Refresh Open in Jira ✨ Summarise
User Pilot not receiving events on report generated
Bug JY-20773 in Jira Cloud
Preview in Slack
Status
Backlog
Priority
Medium
Assignee
Unassigned
As of today at 12:14 PM
Refresh
Open in Jira
✨ Summarise
Open in browser
Open
Share Bug JY-20773
View conversations
More actions
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:14:38 PM
12:14 PM
за това да пипнеш репорта да спре да гърми искаш ли тикет?
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:14:46 PM
12:14
иначе да, нека видим UP kкава му е драмата
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:15:31 PM
12:15 PM
ами ще напиша комент във съществуващ
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:22:18 PM
12:22 PM
Идеята ми е да спрем този репорт да се пробва да се праща и да спами сентри
.
А пък Стели вече ще гледа за фикс за бъдещи такива случаи
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:26:00 PM
12:26 PM
да разбрах, сега ще го маркирам като failed да не го взима следващия крон
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:26:14 PM
12:26 PM
ok
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:26:15 PM
12:26 PM
ако трябва да се пипне и в кода ще си направя тикет
1 reaction, react with +1 emoji
1
Add reaction…
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:26:41 PM
12:26 PM
малко ми е лудница тука между MCP i desktop aпа и какво ли още не и прескачам от чат на чат
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 12:27:25 PM
12:27 PM
разбира се и аз трябваше по-точно да го кажа
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:27:37 PM
12:27
ще ти пиша дали се оправило
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Galya Dimitrova
Today at 12:29:38 PM
12:29 PM
А не
.
Ти сигурно ок си го казал ама чета по диагонал
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Today at 12:29:53 PM
12:29
И другата седмица имаме презднтации пред борда в Лондон и съм до никъде
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Processing uploaded file… complete! Message ready to be sent.
loading…
slackEditVIewTypeError: League|Flysystem|FileCloudWatch | us-east-2G Jy 20820 es reindex stream mod(UY-20725) [HubSpot) Optimise CFJY-20725 add HS rate limit handlitPipelines - jiminny/app( Pull requests • jiminny/appWJY-207731 User Pilot not receivini( Jr-20773 fix user pilot tracking forJY-207761 Automated report - seP Platform Sorint 2 02 . Platform Te@JY-20625 | JY-20742 | MCP POCЬ— Data Exoloren* (UY-20776] Automated report - ser8 Jiminny• Jy-20725 add HS rate limit handlill(SRD-6793) Les Mills activity typePlatform Team - Backlog - JiraPtly-207791 Uiser Dilat not receivinJY-20773 fix user pilot trackin xPipelines - jiminny/app— New TabmistoryWindowHelp• github.com/jiminny/app/pull/12024jiminny / app &<> Code8? Pull requests 32( Agents • Actions L Wiki ® Security and quality 4InsightsLộ Settings@ On April 24 we'll start using GitHub Copilot interaction data for Al model training unless you opt out. Review this update and manage your preferences in your GitHub account settings.JY-20773 fix user pilot tracking for a#12024 •i7 OperLakyLak wants to merge 2 commits into master from JY-20f) Conversation• Commits 2|Fl, Checks3E FileLakvlak commented 2 weeks agoWritePreviewH B### JIRA: JY-20//3#### Chanaes.- Add SerializesModels trait as it seems the UP needs that forE LakyLak and others added 2 commits 2 weeks ago@ Jy-20773 fix user pilot tracking ofr automated repc@@Merge branch 'master' into JY-20773-fix-automated-sonaraubecloud Bot commented 7 minutes agol~ Quality Gate passedIssuesv O New issues0 Accepted issuesMeasuresv O Security Hotspots• U.0% Coverage on New Codev 0.0% Duplication on New CodeSee analvsis details on SonarQube CloudiHomeDMSActivityLaterMoreJiminny...ye Threadsд HuddlesDrafts & sent)DirectoriesAb External connections# Starred8 jiminny-x-integrati...platform-inner-team® Channels# ai-chapter# alerts# backend# bugs# confusion-clinic# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product launches# random# releases"sona-oince# supportt thank-vous# the_people_of jimi...• Direct messages%. Galya DimitrovaR. Steliyan Georgiev@ Dotko KochinckiRº. Aneliya AngelovaFA. Stefka Stoyanova€. Vasil Vasilev 1A Nikolay Ivanov(3) Aneliva Angelova....3 Stovan Taneve lukas Kovalk v::: Apps"suppont Dally • In 1h 22m100% Lzlue 1z May 13.30.10Q Describe what you are looking for₫ . Galya DimitrovaMessagesr FilesUntitledTodayили все пак да има за backlogда взема ли това със UP cега?Galya Dimitrova 12:14 PMла го види за беклога. Ако нешо лесно измисли може и скоро ла го направимlukas Kovalk 12:14PMhttps://iiminnv.atlassian.net/browse/JY-20773Jira CloudUser Pilot not receiving events on report generatedBug JY-20773 in Jira CloudBacklog= Mediumg UnassignedAs of today at 12:14 PMOpen in Jiracalva Dimitrova 12:14 PMза това ла пипнеш репорта ла спое ла гьоми искаш ли тикет?иначе да, нека вилим UP kкава му е драматаLukas Kovalik 12:15PMами ше напиша комент във съществувашGalya Dimitrova 12-22 PMидеята ми е да спрем този репорт да се проова да се праща и да спами сентри. А пьк стели вече ще гледа за фикс за оъдещи такива случаиLukas Kovalik 12:26 PMда разбрах, сега ще го маркирам като failed да не го взима следващия кронGalya Dimitrova 12:26 PMLukas Kovalik 12:26 PMако трябва да се пипне и в кода ще си направя тикетGalya Dimitrova 12:26 PMмалко ми е лудница тука межлу MСР і desktop апа и какво ли още не и прескачам от чат на чатLukas Kovalik 12:27 PMразоира се и аз тояоваше по-точно да го кажаще ти пиша дали се оправилоGalya Dimitrova 12:29 PMА не. Ти сигурно ок си го казал ама чета по диагоналИ другата седмица имаме презднтации пред борда в Лондон и съм до никъдеMessage Galya Dimitrova+ Aa...
|
25031
|
NULL
|
NULL
|
NULL
|
|
3263
|
123
|
44
|
2026-05-07T12:09:12.622275+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778155752622_m1.jpg...
|
iTerm2
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
PostmanFileEditViewWindowHelp$0lohlSupport Daily • PostmanFileEditViewWindowHelp$0lohlSupport Daily • now100% <78DEV (docker)DOCKER₴1DEV (docker)H82APP (-zsh)-zsh• $4screenpipe"•$55.95ms DONE-zshThu 7 May 15:09:12T₴1₴6viewsjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedJiminny-worker-processing-3:7iminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00:stoppedjiminny-worker-processing-5: jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-analytics:worker-analytics_00: stoppedworker-download:worker-download_00: stoppedworker:worker_00: stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00: stoppedworker-audio:worker-audio_00: stoppedworker-emails:worker-emails_00: stoppedartisan-schedule:artisan-schedule_00: stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedJiminny-worker-processing-2:1iminny-worker-processing-2 00: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00: startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00: startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny# php artisan jiminny:debugSyncing opportunity 0Syncing opportunity 25Syncing opportunity 50Syncing opportunity 75Syncing opportunity 100root@docker_lamp_1:/home/jiminny# ]DEV...
|
NULL
|
-7999768672086485562
|
NULL
|
click
|
ocr
|
NULL
|
PostmanFileEditViewWindowHelp$0lohlSupport Daily • PostmanFileEditViewWindowHelp$0lohlSupport Daily • now100% <78DEV (docker)DOCKER₴1DEV (docker)H82APP (-zsh)-zsh• $4screenpipe"•$55.95ms DONE-zshThu 7 May 15:09:12T₴1₴6viewsjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedJiminny-worker-processing-3:7iminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00:stoppedjiminny-worker-processing-5: jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-analytics:worker-analytics_00: stoppedworker-download:worker-download_00: stoppedworker:worker_00: stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00: stoppedworker-audio:worker-audio_00: stoppedworker-emails:worker-emails_00: stoppedartisan-schedule:artisan-schedule_00: stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedJiminny-worker-processing-2:1iminny-worker-processing-2 00: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00: startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00: startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny# php artisan jiminny:debugSyncing opportunity 0Syncing opportunity 25Syncing opportunity 50Syncing opportunity 75Syncing opportunity 100root@docker_lamp_1:/home/jiminny# ]DEV...
|
3261
|
NULL
|
NULL
|
NULL
|
|
990
|
37
|
8
|
2026-05-07T07:55:26.040188+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778140526040_m1.jpg...
|
PhpStorm
|
faVsco.js – RateLimited.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp• Support Daily - in 4 h 5 m100% <78APP (-zsh)DOCKERDEV (-zsh)₴2APP (-zsh)*3-zshcreatemode 100644 database/migrations/2026_04_29_105053_move_ask_jiminny_reports_to_grow_tier.phpcreatemode100644 front-end/src/__mocks__/kit/endpoints/automated-reports-promo.jscreate mode100644 front-end/src/apps/ai-reports-promo.jscreatemode100644 front-end/src/components/AiReports/AiReportsPromo.vuecreatemode100644front-end/src/components/AiReports/AutomatedReportsPromo/AutomatedReportsPromo.vuecreatemode100644front-end/src/components/AiReports/AutomatedReportsPromo/PromoCard.vuecreatemode100644front-end/src/components/AiReports/AutomatedReportsPromo/WhyItMattersCard.vuecreatemode100644 front-end/src/components/AiReports/AutomatedReportsPromo/__tests_./AutomatedReportsPromo.spec.jscreatemode100644 front-end/src/components/AiReports/AutomatedReportsPromo/__tests__/__snapshots__/automated-reports-promo.output.htmlcreatemode 100644 front-end/src/components/AiReports/PanoramaReportsPromo/PanoramaReportsPromo.vuecreate mode 100644 front-end/src/components/AiReports/PanoramaReportsPromo/__tests__/PanoramaReportsPromo.spec.jscreatemode 100644front-end/src/components/AiReports/PanoramaReportsPromo/__tests__/__snapshots__/panorama-reports-promo.output.htmlcreate mode 100644front-end/src/components/Settings/Kiosk/modals/EditTeamModal/.__tests__/EditTeamModal.spec.jscreate mode 100644front-end/src/components/Settings/Kiosk/shared/Navigation/__tests__/Navigation.spec.jscreate mode 100644 front-end/src/components/layout/Sidebar/__tests_/HelpMenu.spec.jscreate mode100644 front-end/src/components/layout/Sidebar/__tests__/useAiReportsSidebarButton.spec.jscreate mode 100644 front-end/src/components/layout/Sidebar/useAiReportsSidebarButton.jscreate mode100644 front-end/src/store/modules/platform/__tests_/getters.spec.jscreate mode 100644 public/pdf/exec-reports/com/coaching-profiles.pdfcreate mode100644 public/pdf/exec-reports/com/exec-summary.pdfcreate mode100644 public/pdf/exec-reports/com/loss-report.pdfcreate mode100644 public/pdf/exec-reports/com/product-feedback.pdfcreate mode100644 public/pdf/exec-reports/eu/coaching-profiles.pdfcreate mode 100644public/pdf/exec-reports/eu/exec-summary.pdfcreate mode 100644public/pdf/exec-reports/eu/loss-report.pdfcreate mode 100644public/pdf/exec-reports/eu/product-feedback.pdfcreate mode 100644 resources/views/emails/reports/ask-jiminny-report-expiring.blade.phpcreate mode 100644 resources/views/emails/reports/report-not-generated.blade.phpcreate mode100644tests/Unit/Component/Transcription/Job/FinishTranscriptionJobTest.phpcreate mode100644tests/Unit/Component/Transcription/TranscriptionProcessor/Gong/GongTest.phpcreate mode100644 tests/Unit/Events/Activities/Audio/RecordingEventTest.phpcreate mode100644tests/Unit/Events/Activities/Softphone/EndedTest.phpcreate mode100644tests/Unit/Events/Activities/Softphone/SoftphoneEventTest.phpcreate mode100644 tests/Unit/Events/Activities/Softphone/StartedTest.phpcreate mode100644tests/Unit/Http/Transformers/PartnerTransformerTest.phpcreate mode100644tests/Unit/Jobs/AutomatedReports/SendReportExpiringSoonMailJobTest.phpcreate mode 100644tests/Unit/Jobs/AutomatedReports/SendReportNotGeneratedMailJobTest.phpcreate mode 100644 tests/Unit/Listeners/Teams/SyncIntercomCompanyTest.phpcreate mode 100644 tests/Unit/Listeners/Users/SyncIntercomTest.phpcreate mode 100644 tests/Unit/Mail/Reports/ReportNotGeneratedTest.phpcreate mode 100644 tests/Unit/Models/PartnerTest.phpcreate mode 100644 tests/Unit/Services/ActivityServiceTest.phpcreate mode 100644 tests/Unit/UseCases/TeamInsights/Recording0utcomeTextResolverTest.phpcreate mode 100644 tests/Unit/UseCases/TeamInsights/StrictConsentColumnResolverTest.phpLukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pulll• *4screenpipe"Thu 7 May 10:55:26T81* *5APP...
|
NULL
|
-7999529408947166608
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp• Support Daily - in 4 h 5 m100% <78APP (-zsh)DOCKERDEV (-zsh)₴2APP (-zsh)*3-zshcreatemode 100644 database/migrations/2026_04_29_105053_move_ask_jiminny_reports_to_grow_tier.phpcreatemode100644 front-end/src/__mocks__/kit/endpoints/automated-reports-promo.jscreate mode100644 front-end/src/apps/ai-reports-promo.jscreatemode100644 front-end/src/components/AiReports/AiReportsPromo.vuecreatemode100644front-end/src/components/AiReports/AutomatedReportsPromo/AutomatedReportsPromo.vuecreatemode100644front-end/src/components/AiReports/AutomatedReportsPromo/PromoCard.vuecreatemode100644front-end/src/components/AiReports/AutomatedReportsPromo/WhyItMattersCard.vuecreatemode100644 front-end/src/components/AiReports/AutomatedReportsPromo/__tests_./AutomatedReportsPromo.spec.jscreatemode100644 front-end/src/components/AiReports/AutomatedReportsPromo/__tests__/__snapshots__/automated-reports-promo.output.htmlcreatemode 100644 front-end/src/components/AiReports/PanoramaReportsPromo/PanoramaReportsPromo.vuecreate mode 100644 front-end/src/components/AiReports/PanoramaReportsPromo/__tests__/PanoramaReportsPromo.spec.jscreatemode 100644front-end/src/components/AiReports/PanoramaReportsPromo/__tests__/__snapshots__/panorama-reports-promo.output.htmlcreate mode 100644front-end/src/components/Settings/Kiosk/modals/EditTeamModal/.__tests__/EditTeamModal.spec.jscreate mode 100644front-end/src/components/Settings/Kiosk/shared/Navigation/__tests__/Navigation.spec.jscreate mode 100644 front-end/src/components/layout/Sidebar/__tests_/HelpMenu.spec.jscreate mode100644 front-end/src/components/layout/Sidebar/__tests__/useAiReportsSidebarButton.spec.jscreate mode 100644 front-end/src/components/layout/Sidebar/useAiReportsSidebarButton.jscreate mode100644 front-end/src/store/modules/platform/__tests_/getters.spec.jscreate mode 100644 public/pdf/exec-reports/com/coaching-profiles.pdfcreate mode100644 public/pdf/exec-reports/com/exec-summary.pdfcreate mode100644 public/pdf/exec-reports/com/loss-report.pdfcreate mode100644 public/pdf/exec-reports/com/product-feedback.pdfcreate mode100644 public/pdf/exec-reports/eu/coaching-profiles.pdfcreate mode 100644public/pdf/exec-reports/eu/exec-summary.pdfcreate mode 100644public/pdf/exec-reports/eu/loss-report.pdfcreate mode 100644public/pdf/exec-reports/eu/product-feedback.pdfcreate mode 100644 resources/views/emails/reports/ask-jiminny-report-expiring.blade.phpcreate mode 100644 resources/views/emails/reports/report-not-generated.blade.phpcreate mode100644tests/Unit/Component/Transcription/Job/FinishTranscriptionJobTest.phpcreate mode100644tests/Unit/Component/Transcription/TranscriptionProcessor/Gong/GongTest.phpcreate mode100644 tests/Unit/Events/Activities/Audio/RecordingEventTest.phpcreate mode100644tests/Unit/Events/Activities/Softphone/EndedTest.phpcreate mode100644tests/Unit/Events/Activities/Softphone/SoftphoneEventTest.phpcreate mode100644 tests/Unit/Events/Activities/Softphone/StartedTest.phpcreate mode100644tests/Unit/Http/Transformers/PartnerTransformerTest.phpcreate mode100644tests/Unit/Jobs/AutomatedReports/SendReportExpiringSoonMailJobTest.phpcreate mode 100644tests/Unit/Jobs/AutomatedReports/SendReportNotGeneratedMailJobTest.phpcreate mode 100644 tests/Unit/Listeners/Teams/SyncIntercomCompanyTest.phpcreate mode 100644 tests/Unit/Listeners/Users/SyncIntercomTest.phpcreate mode 100644 tests/Unit/Mail/Reports/ReportNotGeneratedTest.phpcreate mode 100644 tests/Unit/Models/PartnerTest.phpcreate mode 100644 tests/Unit/Services/ActivityServiceTest.phpcreate mode 100644 tests/Unit/UseCases/TeamInsights/Recording0utcomeTextResolverTest.phpcreate mode 100644 tests/Unit/UseCases/TeamInsights/StrictConsentColumnResolverTest.phpLukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pulll• *4screenpipe"Thu 7 May 10:55:26T81* *5APP...
|
989
|
NULL
|
NULL
|
NULL
|
|
22345
|
968
|
57
|
2026-05-12T07:02:27.200801+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778569347200_m1.jpg...
|
Firefox
|
Platform Sprint 3 Q2 - Platform Team - Scrum Board Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira — Work...
|
True
|
jiminny.atlassian.net/jira/software/c/projects/JY/ jiminny.atlassian.net/jira/software/c/projects/JY/boards/37?selectedIssue=JY-20625...
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20773] User Pilot not receiving events on report generated - Jira
[JY-20773] User Pilot not receiving events on report generated - Jira
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
[JY-20776] Automated report - sentry - Jira
[JY-20776] Automated report - sentry - Jira
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Close tab
JY-20361: Add call scores in Panorama by steliyan-g · Pull Request #507 · jiminny/prophet
JY-20361: Add call scores in Panorama by steliyan-g · Pull Request #507 · jiminny/prophet
LLM API Pricing Comparison & Cost Guide (May 2026)
LLM API Pricing Comparison & Cost Guide (May 2026)
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New Chat
Open menu for conversation actions.
Conversation with Gemini
Conversation with Gemini
Copy prompt
You said I’m on page “<tabTitle>JY-20361: Add call scores in Panorama by steliyan-</tabTitle>” with “<selection>@@ -4,7 +4,7 @@ Today is {date_today}.445System instructions:5System instructions:6- You must answer using markdown. Do not use html tags in your response even if requested by the user's question.6- You must answer using markdown. Do not use html tags in your response even if requested by the user's question.7-- The contexts includes data for call shortlisted through user-applied filters. Note that the calls might not relate to the same deal or not even be by the same sales rep.7+- The context includes data for calls shortlisted through user-applied filters. Note that the calls might not relate to the same deal or not even be by the same sales rep.8 - The full call context includes all calls data available while the short call context contains only an overview of the calls that are analysed. Refer to the short call context for quick reference and to see the overall picture.8 - The full call context includes all calls data available while the short call context contains only an overview of the calls that are analysed. Refer to the short call context for quick reference and to see the overall picture.9- The calls are ordered in chronological order. 9- The calls are ordered in chronological order. 10- Here’s how to use the call context:10- Here’s how to use the call context:@@ -16,6 +16,15 @@ System instructions:16 - Frame answers with awareness of the company’s ICP, deal cycle, and sales motion.16 - Frame answers with awareness of the company’s ICP, deal cycle, and sales motion.17 - Evaluate statements or objections based on how the team operates and what success looks like.17 - Evaluate statements or objections based on how the team operates and what success looks like.18 - Position responses in light of known competitors and market dynamics.18 - Position responses in light of known competitors and market dynamics.19+ - AI call score (`ai_call_score` in the full call JSON): When present, treat it as **pre-computed** output from your team’s AI call-scoring pipeline (the same kind of scoring as the `/call/ai-call-scoring` endpoint). **Do not** invent, override, or recalculate scores; interpret and summarize what is given.20+ - **Short call context:** **AI Scorecard** is the name of the scorecard applied to that call; **AI Score** is the **overall** score for that scorecard (the average of its per-rule scores, possibly shown as a decimal).21+ - **Full call context:** The `ai_call_score` object may include `ai_scorecard_name`, `score` (overall for that scorecard), and `ai_scorecard_rules`. For each rule when listed:22+ - `rule_name`: Title of the criterion.23+ - `rule_prompt`: The criterion text that was evaluated.24+ - `score`: Whole number **1–5** measuring how well the call satisfied that criterion against `rule_prompt` (1 = no evidence / not discussed or contrary; 5 = strong, clear evidence on the call).25+ - `justification`: Short rationale grounded in what happened on the call.26+ - `justification_timestamps`: Up to three entries with speaker **name** and **timestamp** (MM:SS in the recording) highlighting where the justification is supported.27+ - Use scores for coaching summaries, trends across calls, or quick comparisons when relevant. For **what was actually said**, still rely on the **transcript** (you may cross-reference rule timestamps when helpful).19- Use the Message History to:28- Use the Message History to:20 - Maintain continuity if the current question refers to previous exchanges.29 - Maintain continuity if the current question refers to previous exchanges.21 - Clarify or resolve ambiguities if the question depends on prior messages.30 - Clarify or resolve ambiguities if the question depends on prior messages.@@ -28,10 +37,10 @@ System instructions:28 - All factual claims must be supported by one or more references to relevant calls.37 - All factual claims must be supported by one or more references to relevant calls.29 - Use Markdown link syntax ([link text](URL)) and place links inline within sentences. Do not use footnotes, reference sections, or bare URLs. Integrate the reference links directly within the relevant parts of your response, rather than in a separate section.38 - Use Markdown link syntax ([link text](URL)) and place links inline within sentences. Do not use footnotes, reference sections, or bare URLs. Integrate the reference links directly within the relevant parts of your response, rather than in a separate section.30 - Use markdown links in the format [link text](/playback/{{call_id}})39 - Use markdown links in the format [link text](/playback/{{call_id}})31- - Use descriptive link that utlizes the call name. Do not use call time stamps in the link text even if the link itself contains a time stamp, e.g. use 'Call Name' instead of 'Call Name at 10:00'. Never use call ids as link text.\n"40+ - Use descriptive link text that utilizes the call name. Do not use call time stamps in the link text even if the link itself contains a time stamp, e.g. use 'Call Name' instead of 'Call Name at 10:00'. Never use call ids as link text.32- - Good example of link text: [Call Name](/playback/1234567890?apFrom=123)\n"41+ - Good example of link text: [Call Name](/playback/1234567890?apFrom=123)33- - Bad example of link text: [Call Name at 12:34](/playback/1234567890?apFrom=123) (do not use call time stamps in the link text)\n"42+ - Bad example of link text: [Call Name at 12:34](/playback/1234567890?apFrom=123) (do not use call time stamps in the link text)34- - Bad example of links: [Call Name on November 12, 2025](/playback/1234567890?apFrom=123) (do not use dates in the link text)\n\n"43+ - Bad example of links: [Call Name on November 12, 2025](/playback/1234567890?apFrom=123) (do not use dates in the link text)35 - You might back your statements with examples from the provided call transcripts in addition to the reference links.44 - You might back your statements with examples from the provided call transcripts in addition to the reference links.36- Be specific. Use names of accounts, clients and persons involved. Don't just say "one client" or "a client"! If no account is available, use the call title as a reference.45- Be specific. Use names of accounts, clients and persons involved. Don't just say "one client" or "a client"! If no account is available, use the call title as a reference.37- If the question or context is unclear, request clarification or highlight ambiguities.46- If the question or context is unclear, request clarification or highlight ambiguities.</selection>” selected. Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
You said
I’m on page “<tabTitle>JY-20361: Add call scores in Panorama by steliyan-</tabTitle>” with “<selection>@@ -4,7 +4,7 @@ Today is {date_today}.445System instructions:5System instructions:6- You must answer using markdown. Do not use html tags in your response even if requested by the user's question.6- You must answer using markdown. Do not use html tags in your response even if requested by the user's question.7-- The contexts includes data for call shortlisted through user-applied filters. Note that the calls might not relate to the same deal or not even be by the same sales rep.7+- The context includes data for calls shortlisted through user-applied filters. Note that the calls might not relate to the same deal or not even be by the same sales rep.8 - The full call context includes all calls data available while the short call context contains only an overview of the calls that are analysed. Refer to the short call context for quick reference and to see the overall picture.8 - The full call context includes all calls data available while the short call context contains only an overview of the calls that are analysed. Refer to the short call context for quick reference and to see the overall picture.9- The calls are ordered in chronological order. 9- The calls are ordered in chronological order. 10- Here’s how to use the call context:10- Here’s how to use the call context:@@ -16,6 +16,15 @@ System instructions:16 - Frame answers with awareness of the company’s ICP, deal cycle, and sales motion.16 - Frame answers with awareness of the company’s ICP, deal cycle, and sales motion.17 - Evaluate statements or objections based on how the team operates and what success looks like.17 - Evaluate statements or objections based on how the team operates and what success looks like.18 - Position responses in light of known competitors and market dynamics.18 - Position responses in light of known competitors and market dynamics.19+ - AI call score (`ai_call_score` in the full call JSON): When present, treat it as **pre-computed** output from your team’s AI call-scoring pipeline (the same kind of scoring as the `/call/ai-call-scoring` endpoint). **Do not** invent, override, or recalculate scores; interpret and summarize what is given.20+ - **Short call context:** **AI Scorecard** is the name of the scorecard applied to that call; **AI Score** is the **overall** score for that scorecard (the average of its per-rule scores, possibly shown as a decimal).21+ - **Full call context:** The `ai_call_score` object may include `ai_scorecard_name`, `score` (overall for that scorecard), and `ai_scorecard_rules`. For each rule when listed:22+ - `rule_name`: Title of the criterion.23+ - `rule_prompt`: The criterion text that was evaluated.24+ - `score`: Whole number **1–5** measuring how well the call satisfied that criterion against `rule_prompt` (1 = no evidence / not discussed or contrary; 5 = strong, clear evidence on the call).25+ - `justification`: Short rationale grounded in what happened on the call.26+ - `justification_timestamps`: Up to three entries with speaker **name** and **timestamp** (MM:SS in the recording) highlighting where the justification is supported.27+ - Use scores for coaching summaries, trends across calls, or quick comparisons when relevant. For **what was actually said**, still rely on the **transcript** (you may cross-reference rule timestamps when helpful).19- Use the Message History to:28- Use the Message History to:20 - Maintain continuity if the current question refers to previous exchanges.29 - Maintain continuity if the current question refers to previous exchanges.21 - Clarify or resolve ambiguities if the question depends on prior messages.30 - Clarify or resolve ambiguities if the question depends on prior messages.@@ -28,10 +37,10 @@ System instructions:28 - All factual claims must be supported by one or more references to relevant calls.37 - All factual claims must be supported by one or more references to relevant calls.29 - Use Markdown link syntax ([link text](URL)) and place links inline within sentences. Do not use footnotes, reference sections, or bare URLs. Integrate the reference links directly within the relevant parts of your response, rather than in a separate section.38 - Use Markdown link syntax ([link text](URL)) and place links inline within sentences. Do not use footnotes, reference sections, or bare URLs. Integrate the reference links directly within the relevant parts of your response, rather than in a separate section.30 - Use markdown links in the format [link text](/playback/{{call_id}})39 - Use markdown links in the format [link text](/playback/{{call_id}})31- - Use descriptive link that utlizes the call name. Do not use call time stamps in the link text even if the link itself contains a time stamp, e.g. use 'Call Name' instead of 'Call Name at 10:00'. Never use call ids as link text.\n"40+ - Use descriptive link text that utilizes the call name. Do not use call time stamps in the link text even if the link itself contains a time stamp, e.g. use 'Call Name' instead of 'Call Name at 10:00'. Never use call ids as link text.32- - Good example of link text: [Call Name](/playback/1234567890?apFrom=123)\n"41+ - Good example of link text: [Call Name](/playback/1234567890?apFrom=123)33- - Bad example of link text: [Call Name at 12:34](/playback/1234567890?apFrom=123) (do not use call time stamps in the link text)\n"42+ - Bad example of link text: [Call Name at 12:34](/playback/1234567890?apFrom=123) (do not use call time stamps in the link text)34- - Bad example of links: [Call Name on November 12, 2025](/playback/1234567890?apFrom=123) (do not use dates in the link text)\n\n"43+ - Bad example of links: [Call Name on November 12, 2025](/playback/1234567890?apFrom=123) (do not use dates in the link text)35 - You might back your statements with examples from the provided call transcripts in addition to the reference links.44 - You might back your statements with examples from the provided call transcripts in addition to the reference links.36- Be specific. Use names of accounts, clients and persons involved. Don't just say "one client" or "a client"! If no account is available, use the call title as a reference.45- Be specific. Use names of accounts, clients and persons involved. Don't just say "one client" or "a client"! If no account is available, use the call title as a reference.37- If the question or context is unclear, request clarification or highlight ambiguities.46- If the question or context is unclear, request clarification or highlight ambiguities.</selection>” selected.
Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
Expand
Listen
Show thinking
Gemini said
Gemini said
Here is a summary of the changes in the provided code diff:
AI Call Scoring Additions
AI Call Scoring Additions
Pre-computed Scores:
Added strict instructions to treat the
ai_call_score
as pre-computed data. The system must interpret and summarize the provided scores rather than inventing or recalculating them.
Context Breakdown:
*
Short Context:
Now displays the
AI Scorecard
name and the overall
AI Score
(the average of per-rule scores).
Full Context:
Details the
ai_call_score
object, breaking down individual rules. Each rule includes a title, prompt, a 1–5 score, a brief justification, and up to three timestamped speaker references (MM:SS)....
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20773] User Pilot not receiving events on report generated - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20773] User Pilot not receiving events on report generated - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20776] Automated report - sentry - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20776] Automated report - sentry - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-20361: Add call scores in Panorama by steliyan-g · Pull Request #507 · jiminny/prophet","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20361: Add call scores in Panorama by steliyan-g · Pull Request #507 · jiminny/prophet","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"LLM API Pricing Comparison & Cost Guide (May 2026)","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LLM API Pricing Comparison & Cost Guide (May 2026)","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Close Google Gemini (⌃X)","depth":6,"bounds":{"left":0.0,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.0,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.019097222,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.04236111,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Chat settings","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"WORK, Google Account: lukas.kovalik@jiminny.com","depth":12,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Main menu","depth":12,"on_screen":true,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Chat","depth":12,"on_screen":true,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open menu for conversation actions.","depth":12,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Conversation with Gemini","depth":15,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Conversation with Gemini","depth":16,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy prompt","depth":21,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"You said I’m on page “<tabTitle>JY-20361: Add call scores in Panorama by steliyan-</tabTitle>” with “<selection>@@ -4,7 +4,7 @@ Today is {date_today}.445System instructions:5System instructions:6- You must answer using markdown. Do not use html tags in your response even if requested by the user's question.6- You must answer using markdown. Do not use html tags in your response even if requested by the user's question.7-- The contexts includes data for call shortlisted through user-applied filters. Note that the calls might not relate to the same deal or not even be by the same sales rep.7+- The context includes data for calls shortlisted through user-applied filters. Note that the calls might not relate to the same deal or not even be by the same sales rep.8 - The full call context includes all calls data available while the short call context contains only an overview of the calls that are analysed. Refer to the short call context for quick reference and to see the overall picture.8 - The full call context includes all calls data available while the short call context contains only an overview of the calls that are analysed. Refer to the short call context for quick reference and to see the overall picture.9- The calls are ordered in chronological order. 9- The calls are ordered in chronological order. 10- Here’s how to use the call context:10- Here’s how to use the call context:@@ -16,6 +16,15 @@ System instructions:16 - Frame answers with awareness of the company’s ICP, deal cycle, and sales motion.16 - Frame answers with awareness of the company’s ICP, deal cycle, and sales motion.17 - Evaluate statements or objections based on how the team operates and what success looks like.17 - Evaluate statements or objections based on how the team operates and what success looks like.18 - Position responses in light of known competitors and market dynamics.18 - Position responses in light of known competitors and market dynamics.19+ - AI call score (`ai_call_score` in the full call JSON): When present, treat it as **pre-computed** output from your team’s AI call-scoring pipeline (the same kind of scoring as the `/call/ai-call-scoring` endpoint). **Do not** invent, override, or recalculate scores; interpret and summarize what is given.20+ - **Short call context:** **AI Scorecard** is the name of the scorecard applied to that call; **AI Score** is the **overall** score for that scorecard (the average of its per-rule scores, possibly shown as a decimal).21+ - **Full call context:** The `ai_call_score` object may include `ai_scorecard_name`, `score` (overall for that scorecard), and `ai_scorecard_rules`. For each rule when listed:22+ - `rule_name`: Title of the criterion.23+ - `rule_prompt`: The criterion text that was evaluated.24+ - `score`: Whole number **1–5** measuring how well the call satisfied that criterion against `rule_prompt` (1 = no evidence / not discussed or contrary; 5 = strong, clear evidence on the call).25+ - `justification`: Short rationale grounded in what happened on the call.26+ - `justification_timestamps`: Up to three entries with speaker **name** and **timestamp** (MM:SS in the recording) highlighting where the justification is supported.27+ - Use scores for coaching summaries, trends across calls, or quick comparisons when relevant. For **what was actually said**, still rely on the **transcript** (you may cross-reference rule timestamps when helpful).19- Use the Message History to:28- Use the Message History to:20 - Maintain continuity if the current question refers to previous exchanges.29 - Maintain continuity if the current question refers to previous exchanges.21 - Clarify or resolve ambiguities if the question depends on prior messages.30 - Clarify or resolve ambiguities if the question depends on prior messages.@@ -28,10 +37,10 @@ System instructions:28 - All factual claims must be supported by one or more references to relevant calls.37 - All factual claims must be supported by one or more references to relevant calls.29 - Use Markdown link syntax ([link text](URL)) and place links inline within sentences. Do not use footnotes, reference sections, or bare URLs. Integrate the reference links directly within the relevant parts of your response, rather than in a separate section.38 - Use Markdown link syntax ([link text](URL)) and place links inline within sentences. Do not use footnotes, reference sections, or bare URLs. Integrate the reference links directly within the relevant parts of your response, rather than in a separate section.30 - Use markdown links in the format [link text](/playback/{{call_id}})39 - Use markdown links in the format [link text](/playback/{{call_id}})31- - Use descriptive link that utlizes the call name. Do not use call time stamps in the link text even if the link itself contains a time stamp, e.g. use 'Call Name' instead of 'Call Name at 10:00'. Never use call ids as link text.\\n"40+ - Use descriptive link text that utilizes the call name. Do not use call time stamps in the link text even if the link itself contains a time stamp, e.g. use 'Call Name' instead of 'Call Name at 10:00'. Never use call ids as link text.32- - Good example of link text: [Call Name](/playback/1234567890?apFrom=123)\\n"41+ - Good example of link text: [Call Name](/playback/1234567890?apFrom=123)33- - Bad example of link text: [Call Name at 12:34](/playback/1234567890?apFrom=123) (do not use call time stamps in the link text)\\n"42+ - Bad example of link text: [Call Name at 12:34](/playback/1234567890?apFrom=123) (do not use call time stamps in the link text)34- - Bad example of links: [Call Name on November 12, 2025](/playback/1234567890?apFrom=123) (do not use dates in the link text)\\n\\n"43+ - Bad example of links: [Call Name on November 12, 2025](/playback/1234567890?apFrom=123) (do not use dates in the link text)35 - You might back your statements with examples from the provided call transcripts in addition to the reference links.44 - You might back your statements with examples from the provided call transcripts in addition to the reference links.36- Be specific. Use names of accounts, clients and persons involved. Don't just say "one client" or "a client"! If no account is available, use the call title as a reference.45- Be specific. Use names of accounts, clients and persons involved. Don't just say "one client" or "a client"! If no account is available, use the call title as a reference.37- If the question or context is unclear, request clarification or highlight ambiguities.46- If the question or context is unclear, request clarification or highlight ambiguities.</selection>” selected. Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.","depth":21,"on_screen":false,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You said","depth":23,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"I’m on page “<tabTitle>JY-20361: Add call scores in Panorama by steliyan-</tabTitle>” with “<selection>@@ -4,7 +4,7 @@ Today is {date_today}.445System instructions:5System instructions:6- You must answer using markdown. Do not use html tags in your response even if requested by the user's question.6- You must answer using markdown. Do not use html tags in your response even if requested by the user's question.7-- The contexts includes data for call shortlisted through user-applied filters. Note that the calls might not relate to the same deal or not even be by the same sales rep.7+- The context includes data for calls shortlisted through user-applied filters. Note that the calls might not relate to the same deal or not even be by the same sales rep.8 - The full call context includes all calls data available while the short call context contains only an overview of the calls that are analysed. Refer to the short call context for quick reference and to see the overall picture.8 - The full call context includes all calls data available while the short call context contains only an overview of the calls that are analysed. Refer to the short call context for quick reference and to see the overall picture.9- The calls are ordered in chronological order. 9- The calls are ordered in chronological order. 10- Here’s how to use the call context:10- Here’s how to use the call context:@@ -16,6 +16,15 @@ System instructions:16 - Frame answers with awareness of the company’s ICP, deal cycle, and sales motion.16 - Frame answers with awareness of the company’s ICP, deal cycle, and sales motion.17 - Evaluate statements or objections based on how the team operates and what success looks like.17 - Evaluate statements or objections based on how the team operates and what success looks like.18 - Position responses in light of known competitors and market dynamics.18 - Position responses in light of known competitors and market dynamics.19+ - AI call score (`ai_call_score` in the full call JSON): When present, treat it as **pre-computed** output from your team’s AI call-scoring pipeline (the same kind of scoring as the `/call/ai-call-scoring` endpoint). **Do not** invent, override, or recalculate scores; interpret and summarize what is given.20+ - **Short call context:** **AI Scorecard** is the name of the scorecard applied to that call; **AI Score** is the **overall** score for that scorecard (the average of its per-rule scores, possibly shown as a decimal).21+ - **Full call context:** The `ai_call_score` object may include `ai_scorecard_name`, `score` (overall for that scorecard), and `ai_scorecard_rules`. For each rule when listed:22+ - `rule_name`: Title of the criterion.23+ - `rule_prompt`: The criterion text that was evaluated.24+ - `score`: Whole number **1–5** measuring how well the call satisfied that criterion against `rule_prompt` (1 = no evidence / not discussed or contrary; 5 = strong, clear evidence on the call).25+ - `justification`: Short rationale grounded in what happened on the call.26+ - `justification_timestamps`: Up to three entries with speaker **name** and **timestamp** (MM:SS in the recording) highlighting where the justification is supported.27+ - Use scores for coaching summaries, trends across calls, or quick comparisons when relevant. For **what was actually said**, still rely on the **transcript** (you may cross-reference rule timestamps when helpful).19- Use the Message History to:28- Use the Message History to:20 - Maintain continuity if the current question refers to previous exchanges.29 - Maintain continuity if the current question refers to previous exchanges.21 - Clarify or resolve ambiguities if the question depends on prior messages.30 - Clarify or resolve ambiguities if the question depends on prior messages.@@ -28,10 +37,10 @@ System instructions:28 - All factual claims must be supported by one or more references to relevant calls.37 - All factual claims must be supported by one or more references to relevant calls.29 - Use Markdown link syntax ([link text](URL)) and place links inline within sentences. Do not use footnotes, reference sections, or bare URLs. Integrate the reference links directly within the relevant parts of your response, rather than in a separate section.38 - Use Markdown link syntax ([link text](URL)) and place links inline within sentences. Do not use footnotes, reference sections, or bare URLs. Integrate the reference links directly within the relevant parts of your response, rather than in a separate section.30 - Use markdown links in the format [link text](/playback/{{call_id}})39 - Use markdown links in the format [link text](/playback/{{call_id}})31- - Use descriptive link that utlizes the call name. Do not use call time stamps in the link text even if the link itself contains a time stamp, e.g. use 'Call Name' instead of 'Call Name at 10:00'. Never use call ids as link text.\\n"40+ - Use descriptive link text that utilizes the call name. Do not use call time stamps in the link text even if the link itself contains a time stamp, e.g. use 'Call Name' instead of 'Call Name at 10:00'. Never use call ids as link text.32- - Good example of link text: [Call Name](/playback/1234567890?apFrom=123)\\n"41+ - Good example of link text: [Call Name](/playback/1234567890?apFrom=123)33- - Bad example of link text: [Call Name at 12:34](/playback/1234567890?apFrom=123) (do not use call time stamps in the link text)\\n"42+ - Bad example of link text: [Call Name at 12:34](/playback/1234567890?apFrom=123) (do not use call time stamps in the link text)34- - Bad example of links: [Call Name on November 12, 2025](/playback/1234567890?apFrom=123) (do not use dates in the link text)\\n\\n"43+ - Bad example of links: [Call Name on November 12, 2025](/playback/1234567890?apFrom=123) (do not use dates in the link text)35 - You might back your statements with examples from the provided call transcripts in addition to the reference links.44 - You might back your statements with examples from the provided call transcripts in addition to the reference links.36- Be specific. Use names of accounts, clients and persons involved. Don't just say "one client" or "a client"! If no account is available, use the call title as a reference.45- Be specific. Use names of accounts, clients and persons involved. Don't just say "one client" or "a client"! If no account is available, use the call title as a reference.37- If the question or context is unclear, request clarification or highlight ambiguities.46- If the question or context is unclear, request clarification or highlight ambiguities.</selection>” selected.","depth":23,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.","depth":23,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand","depth":21,"on_screen":false,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Listen","depth":22,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Show thinking","depth":25,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Gemini said","depth":20,"on_screen":false,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Gemini said","depth":21,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Here is a summary of the changes in the provided code diff:","depth":24,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"AI Call Scoring Additions","depth":23,"on_screen":false,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AI Call Scoring Additions","depth":24,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Pre-computed Scores:","depth":26,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Added strict instructions to treat the","depth":26,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ai_call_score","depth":27,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"as pre-computed data. The system must interpret and summarize the provided scores rather than inventing or recalculating them.","depth":26,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Context Breakdown:","depth":26,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"*","depth":26,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Short Context:","depth":26,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Now displays the","depth":26,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AI Scorecard","depth":26,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"name and the overall","depth":26,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AI Score","depth":26,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(the average of per-rule scores).","depth":26,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Full Context:","depth":28,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Details the","depth":28,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ai_call_score","depth":29,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"object, breaking down individual rules. Each rule includes a title, prompt, a 1–5 score, a brief justification, and up to three timestamped speaker references (MM:SS).","depth":28,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-7998327604933611940
|
-2831912997542446190
|
visual_change
|
accessibility
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20773] User Pilot not receiving events on report generated - Jira
[JY-20773] User Pilot not receiving events on report generated - Jira
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
[JY-20776] Automated report - sentry - Jira
[JY-20776] Automated report - sentry - Jira
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Close tab
JY-20361: Add call scores in Panorama by steliyan-g · Pull Request #507 · jiminny/prophet
JY-20361: Add call scores in Panorama by steliyan-g · Pull Request #507 · jiminny/prophet
LLM API Pricing Comparison & Cost Guide (May 2026)
LLM API Pricing Comparison & Cost Guide (May 2026)
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New Chat
Open menu for conversation actions.
Conversation with Gemini
Conversation with Gemini
Copy prompt
You said I’m on page “<tabTitle>JY-20361: Add call scores in Panorama by steliyan-</tabTitle>” with “<selection>@@ -4,7 +4,7 @@ Today is {date_today}.445System instructions:5System instructions:6- You must answer using markdown. Do not use html tags in your response even if requested by the user's question.6- You must answer using markdown. Do not use html tags in your response even if requested by the user's question.7-- The contexts includes data for call shortlisted through user-applied filters. Note that the calls might not relate to the same deal or not even be by the same sales rep.7+- The context includes data for calls shortlisted through user-applied filters. Note that the calls might not relate to the same deal or not even be by the same sales rep.8 - The full call context includes all calls data available while the short call context contains only an overview of the calls that are analysed. Refer to the short call context for quick reference and to see the overall picture.8 - The full call context includes all calls data available while the short call context contains only an overview of the calls that are analysed. Refer to the short call context for quick reference and to see the overall picture.9- The calls are ordered in chronological order. 9- The calls are ordered in chronological order. 10- Here’s how to use the call context:10- Here’s how to use the call context:@@ -16,6 +16,15 @@ System instructions:16 - Frame answers with awareness of the company’s ICP, deal cycle, and sales motion.16 - Frame answers with awareness of the company’s ICP, deal cycle, and sales motion.17 - Evaluate statements or objections based on how the team operates and what success looks like.17 - Evaluate statements or objections based on how the team operates and what success looks like.18 - Position responses in light of known competitors and market dynamics.18 - Position responses in light of known competitors and market dynamics.19+ - AI call score (`ai_call_score` in the full call JSON): When present, treat it as **pre-computed** output from your team’s AI call-scoring pipeline (the same kind of scoring as the `/call/ai-call-scoring` endpoint). **Do not** invent, override, or recalculate scores; interpret and summarize what is given.20+ - **Short call context:** **AI Scorecard** is the name of the scorecard applied to that call; **AI Score** is the **overall** score for that scorecard (the average of its per-rule scores, possibly shown as a decimal).21+ - **Full call context:** The `ai_call_score` object may include `ai_scorecard_name`, `score` (overall for that scorecard), and `ai_scorecard_rules`. For each rule when listed:22+ - `rule_name`: Title of the criterion.23+ - `rule_prompt`: The criterion text that was evaluated.24+ - `score`: Whole number **1–5** measuring how well the call satisfied that criterion against `rule_prompt` (1 = no evidence / not discussed or contrary; 5 = strong, clear evidence on the call).25+ - `justification`: Short rationale grounded in what happened on the call.26+ - `justification_timestamps`: Up to three entries with speaker **name** and **timestamp** (MM:SS in the recording) highlighting where the justification is supported.27+ - Use scores for coaching summaries, trends across calls, or quick comparisons when relevant. For **what was actually said**, still rely on the **transcript** (you may cross-reference rule timestamps when helpful).19- Use the Message History to:28- Use the Message History to:20 - Maintain continuity if the current question refers to previous exchanges.29 - Maintain continuity if the current question refers to previous exchanges.21 - Clarify or resolve ambiguities if the question depends on prior messages.30 - Clarify or resolve ambiguities if the question depends on prior messages.@@ -28,10 +37,10 @@ System instructions:28 - All factual claims must be supported by one or more references to relevant calls.37 - All factual claims must be supported by one or more references to relevant calls.29 - Use Markdown link syntax ([link text](URL)) and place links inline within sentences. Do not use footnotes, reference sections, or bare URLs. Integrate the reference links directly within the relevant parts of your response, rather than in a separate section.38 - Use Markdown link syntax ([link text](URL)) and place links inline within sentences. Do not use footnotes, reference sections, or bare URLs. Integrate the reference links directly within the relevant parts of your response, rather than in a separate section.30 - Use markdown links in the format [link text](/playback/{{call_id}})39 - Use markdown links in the format [link text](/playback/{{call_id}})31- - Use descriptive link that utlizes the call name. Do not use call time stamps in the link text even if the link itself contains a time stamp, e.g. use 'Call Name' instead of 'Call Name at 10:00'. Never use call ids as link text.\n"40+ - Use descriptive link text that utilizes the call name. Do not use call time stamps in the link text even if the link itself contains a time stamp, e.g. use 'Call Name' instead of 'Call Name at 10:00'. Never use call ids as link text.32- - Good example of link text: [Call Name](/playback/1234567890?apFrom=123)\n"41+ - Good example of link text: [Call Name](/playback/1234567890?apFrom=123)33- - Bad example of link text: [Call Name at 12:34](/playback/1234567890?apFrom=123) (do not use call time stamps in the link text)\n"42+ - Bad example of link text: [Call Name at 12:34](/playback/1234567890?apFrom=123) (do not use call time stamps in the link text)34- - Bad example of links: [Call Name on November 12, 2025](/playback/1234567890?apFrom=123) (do not use dates in the link text)\n\n"43+ - Bad example of links: [Call Name on November 12, 2025](/playback/1234567890?apFrom=123) (do not use dates in the link text)35 - You might back your statements with examples from the provided call transcripts in addition to the reference links.44 - You might back your statements with examples from the provided call transcripts in addition to the reference links.36- Be specific. Use names of accounts, clients and persons involved. Don't just say "one client" or "a client"! If no account is available, use the call title as a reference.45- Be specific. Use names of accounts, clients and persons involved. Don't just say "one client" or "a client"! If no account is available, use the call title as a reference.37- If the question or context is unclear, request clarification or highlight ambiguities.46- If the question or context is unclear, request clarification or highlight ambiguities.</selection>” selected. Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
You said
I’m on page “<tabTitle>JY-20361: Add call scores in Panorama by steliyan-</tabTitle>” with “<selection>@@ -4,7 +4,7 @@ Today is {date_today}.445System instructions:5System instructions:6- You must answer using markdown. Do not use html tags in your response even if requested by the user's question.6- You must answer using markdown. Do not use html tags in your response even if requested by the user's question.7-- The contexts includes data for call shortlisted through user-applied filters. Note that the calls might not relate to the same deal or not even be by the same sales rep.7+- The context includes data for calls shortlisted through user-applied filters. Note that the calls might not relate to the same deal or not even be by the same sales rep.8 - The full call context includes all calls data available while the short call context contains only an overview of the calls that are analysed. Refer to the short call context for quick reference and to see the overall picture.8 - The full call context includes all calls data available while the short call context contains only an overview of the calls that are analysed. Refer to the short call context for quick reference and to see the overall picture.9- The calls are ordered in chronological order. 9- The calls are ordered in chronological order. 10- Here’s how to use the call context:10- Here’s how to use the call context:@@ -16,6 +16,15 @@ System instructions:16 - Frame answers with awareness of the company’s ICP, deal cycle, and sales motion.16 - Frame answers with awareness of the company’s ICP, deal cycle, and sales motion.17 - Evaluate statements or objections based on how the team operates and what success looks like.17 - Evaluate statements or objections based on how the team operates and what success looks like.18 - Position responses in light of known competitors and market dynamics.18 - Position responses in light of known competitors and market dynamics.19+ - AI call score (`ai_call_score` in the full call JSON): When present, treat it as **pre-computed** output from your team’s AI call-scoring pipeline (the same kind of scoring as the `/call/ai-call-scoring` endpoint). **Do not** invent, override, or recalculate scores; interpret and summarize what is given.20+ - **Short call context:** **AI Scorecard** is the name of the scorecard applied to that call; **AI Score** is the **overall** score for that scorecard (the average of its per-rule scores, possibly shown as a decimal).21+ - **Full call context:** The `ai_call_score` object may include `ai_scorecard_name`, `score` (overall for that scorecard), and `ai_scorecard_rules`. For each rule when listed:22+ - `rule_name`: Title of the criterion.23+ - `rule_prompt`: The criterion text that was evaluated.24+ - `score`: Whole number **1–5** measuring how well the call satisfied that criterion against `rule_prompt` (1 = no evidence / not discussed or contrary; 5 = strong, clear evidence on the call).25+ - `justification`: Short rationale grounded in what happened on the call.26+ - `justification_timestamps`: Up to three entries with speaker **name** and **timestamp** (MM:SS in the recording) highlighting where the justification is supported.27+ - Use scores for coaching summaries, trends across calls, or quick comparisons when relevant. For **what was actually said**, still rely on the **transcript** (you may cross-reference rule timestamps when helpful).19- Use the Message History to:28- Use the Message History to:20 - Maintain continuity if the current question refers to previous exchanges.29 - Maintain continuity if the current question refers to previous exchanges.21 - Clarify or resolve ambiguities if the question depends on prior messages.30 - Clarify or resolve ambiguities if the question depends on prior messages.@@ -28,10 +37,10 @@ System instructions:28 - All factual claims must be supported by one or more references to relevant calls.37 - All factual claims must be supported by one or more references to relevant calls.29 - Use Markdown link syntax ([link text](URL)) and place links inline within sentences. Do not use footnotes, reference sections, or bare URLs. Integrate the reference links directly within the relevant parts of your response, rather than in a separate section.38 - Use Markdown link syntax ([link text](URL)) and place links inline within sentences. Do not use footnotes, reference sections, or bare URLs. Integrate the reference links directly within the relevant parts of your response, rather than in a separate section.30 - Use markdown links in the format [link text](/playback/{{call_id}})39 - Use markdown links in the format [link text](/playback/{{call_id}})31- - Use descriptive link that utlizes the call name. Do not use call time stamps in the link text even if the link itself contains a time stamp, e.g. use 'Call Name' instead of 'Call Name at 10:00'. Never use call ids as link text.\n"40+ - Use descriptive link text that utilizes the call name. Do not use call time stamps in the link text even if the link itself contains a time stamp, e.g. use 'Call Name' instead of 'Call Name at 10:00'. Never use call ids as link text.32- - Good example of link text: [Call Name](/playback/1234567890?apFrom=123)\n"41+ - Good example of link text: [Call Name](/playback/1234567890?apFrom=123)33- - Bad example of link text: [Call Name at 12:34](/playback/1234567890?apFrom=123) (do not use call time stamps in the link text)\n"42+ - Bad example of link text: [Call Name at 12:34](/playback/1234567890?apFrom=123) (do not use call time stamps in the link text)34- - Bad example of links: [Call Name on November 12, 2025](/playback/1234567890?apFrom=123) (do not use dates in the link text)\n\n"43+ - Bad example of links: [Call Name on November 12, 2025](/playback/1234567890?apFrom=123) (do not use dates in the link text)35 - You might back your statements with examples from the provided call transcripts in addition to the reference links.44 - You might back your statements with examples from the provided call transcripts in addition to the reference links.36- Be specific. Use names of accounts, clients and persons involved. Don't just say "one client" or "a client"! If no account is available, use the call title as a reference.45- Be specific. Use names of accounts, clients and persons involved. Don't just say "one client" or "a client"! If no account is available, use the call title as a reference.37- If the question or context is unclear, request clarification or highlight ambiguities.46- If the question or context is unclear, request clarification or highlight ambiguities.</selection>” selected.
Please summarize the selection using precise and concise language. Use headers and bulleted lists in the summary, to make it scannable. Maintain the meaning and factual accuracy.
Expand
Listen
Show thinking
Gemini said
Gemini said
Here is a summary of the changes in the provided code diff:
AI Call Scoring Additions
AI Call Scoring Additions
Pre-computed Scores:
Added strict instructions to treat the
ai_call_score
as pre-computed data. The system must interpret and summarize the provided scores rather than inventing or recalculating them.
Context Breakdown:
*
Short Context:
Now displays the
AI Scorecard
name and the overall
AI Score
(the average of per-rule scores).
Full Context:
Details the
ai_call_score
object, breaking down individual rules. Each rule includes a title, prompt, a 1–5 score, a brief justification, and up to three timestamped speaker references (MM:SS)....
|
22344
|
NULL
|
NULL
|
NULL
|
|
22900
|
978
|
16
|
2026-05-12T07:26:00.535726+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778570760535_m1.jpg...
|
QuickTime Player
|
PLanhat Petko interest event 2026-05-11.mp4
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Petko Kashinski
Screen share
Chrome
File
Edit
View Petko Kashinski
Screen share
Chrome
File
Edit
View
History
Bookmarks
Profiles
Tab
Window
Help
分
*
Work
Gree
Score
andre
@ wilso
Call A
Jimin
M Inbox
NX
ニ Apps
Build
ws.planhat.com/jiminny/home/data-explorer/usagemetricdef?preview=UsageMetricDef.674543e45a4792694fe994e5
★
u
■ AIKB
ChatPlayground Al...
M
GMail
Apps
Jiminny ~
Content Explorer
Data Explorer
" Notifications
* Email Manager
Sections -
CS Day-to-day *
Getting started Guide
€ Just CS Data
E
田
H
* Daily Operations
• Weekly prep
• Renewals and Upsell
Risk and Churn Analytics
目
Implementation
Impl Projects
Trial Opps (Under Review)
Stoyan's clients
Leadership
E
• System Reports
Leadership Operations
Portfolio Overview (Dashbo….
NPS Report - Greg
Client Engagement Overview
Revenue Analytics
Jiminny - Calenda...
My Calendly - Eve...
= PH New Ul Login
Get Starting with J...
Search Jiminny
8 Metric ~
@ Dataset
playbackVisited
ser
Q PLAYBACK
+ Metric
activities.playbackVisited
Name
Tyr
Overview
Raw Data
Trace
Company 2
• Playback Adoption Avg
Cal
Metrics
• Playback Adoption
EndUser 4
JUsers Playback Adoption
Cal
Playback Adoption (Last 7 days)
Playback Adoption
Cal
playbackVisited
Usi
Comments
Add a comment
Chloe Onboarding…..
Filter by Company
WEEKS
as a
SUM
No groups found
+ Show full list
の
u User
New
+ CX Journey SMB...
+
8•
Mon 11 May 12:20
i User
ロ
E Work
X
Petko
Feb 11, 2026 - May 10, 2026
7= Al Notes: Off
zoom
田
A...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Petko Kashinski\nScreen share","depth":2,"bounds":{"left":0.0022771326,"top":0.039010823,"width":0.07848837,"height":0.037549384},"on_screen":true,"lines":[{"char_start":0,"char_count":16,"bounds":{"left":0.0022771326,"top":0.039010823,"width":0.07848837,"height":0.016469594}},{"char_start":16,"char_count":12,"bounds":{"left":0.0022771326,"top":0.062255677,"width":0.05377907,"height":0.014304527}}],"value":"Petko Kashinski\nScreen share","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Chrome","depth":2,"bounds":{"left":0.028439922,"top":0.095033295,"width":0.031976745,"height":0.011633199},"on_screen":true,"value":"Chrome","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"File","depth":2,"bounds":{"left":0.070591085,"top":0.095033295,"width":0.014534883,"height":0.011633199},"on_screen":true,"value":"File","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Edit","depth":2,"bounds":{"left":0.09530039,"top":0.095033295,"width":0.015988372,"height":0.011633199},"on_screen":true,"value":"Edit","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"View","depth":2,"bounds":{"left":0.12146318,"top":0.095033295,"width":0.018895349,"height":0.011633199},"on_screen":true,"value":"View","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"History","depth":2,"bounds":{"left":0.15053295,"top":0.095033295,"width":0.02761628,"height":0.013959839},"on_screen":true,"value":"History","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Bookmarks","depth":2,"bounds":{"left":0.18832365,"top":0.095033295,"width":0.04215116,"height":0.011633199},"on_screen":true,"value":"Bookmarks","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Profiles","depth":2,"bounds":{"left":0.24064922,"top":0.095033295,"width":0.029069766,"height":0.011633199},"on_screen":true,"value":"Profiles","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Tab","depth":2,"bounds":{"left":0.2784399,"top":0.095033295,"width":0.014534883,"height":0.011633199},"on_screen":true,"value":"Tab","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Window","depth":2,"bounds":{"left":0.30314922,"top":0.095033295,"width":0.030523255,"height":0.011633199},"on_screen":true,"value":"Window","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Help","depth":2,"bounds":{"left":0.3438469,"top":0.095033295,"width":0.018895349,"height":0.013959839},"on_screen":true,"value":"Help","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"分","depth":2,"bounds":{"left":0.52407944,"top":0.09270666,"width":0.010174419,"height":0.018613119},"on_screen":true,"value":"分","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"*","depth":2,"bounds":{"left":0.582219,"top":0.09270666,"width":0.0072674416,"height":0.01628648},"on_screen":true,"value":"*","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Work","depth":2,"bounds":{"left":0.12437016,"top":0.12760626,"width":0.020348838,"height":0.0116332},"on_screen":true,"value":"Work","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Gree","depth":2,"bounds":{"left":0.19849806,"top":0.1299329,"width":0.01744186,"height":0.006979919},"on_screen":true,"value":"Gree","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Score","depth":2,"bounds":{"left":0.24500969,"top":0.12760626,"width":0.018895349,"height":0.011633199},"on_screen":true,"value":"Score","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"andre","depth":2,"bounds":{"left":0.29006782,"top":0.12760626,"width":0.020348838,"height":0.011633199},"on_screen":true,"value":"andre","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"@ wilso","depth":2,"bounds":{"left":0.32204458,"top":0.12483798,"width":0.03343023,"height":0.016986625},"on_screen":true,"value":"@ wilso","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Call A","depth":2,"bounds":{"left":0.3816376,"top":0.12752008,"width":0.021802325,"height":0.011719371},"on_screen":true,"value":"Call A","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Jimin","depth":2,"bounds":{"left":0.42814922,"top":0.12760626,"width":0.018895349,"height":0.011633199},"on_screen":true,"value":"Jimin","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"M Inbox","depth":2,"bounds":{"left":0.46012598,"top":0.12752008,"width":0.03343023,"height":0.011719371},"on_screen":true,"value":"M Inbox","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"NX","depth":2,"bounds":{"left":0.52138036,"top":0.12752008,"width":0.017233986,"height":0.011719371},"on_screen":true,"value":"NX","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"ニ Apps","depth":2,"bounds":{"left":0.5531492,"top":0.12752008,"width":0.03197674,"height":0.014304527},"on_screen":true,"value":"ニ Apps","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Build","depth":2,"bounds":{"left":0.6112888,"top":0.12760626,"width":0.018895349,"height":0.011633199},"on_screen":true,"value":"Build","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"ws.planhat.com/jiminny/home/data-explorer/usagemetricdef?preview=UsageMetricDef.674543e45a4792694fe994e5","depth":2,"bounds":{"left":0.08948644,"top":0.16715913,"width":0.4593023,"height":0.01628648},"on_screen":true,"value":"ws.planhat.com/jiminny/home/data-explorer/usagemetricdef?preview=UsageMetricDef.674543e45a4792694fe994e5","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"★","depth":2,"bounds":{"left":0.58657944,"top":0.16715913,"width":0.010174419,"height":0.01628648},"on_screen":true,"value":"★","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"u","depth":2,"bounds":{"left":0.6156492,"top":0.16715913,"width":0.011627907,"height":0.01628648},"on_screen":true,"value":"u","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"■ AIKB","depth":2,"bounds":{"left":0.006637598,"top":0.20438537,"width":0.030523255,"height":0.01164397},"on_screen":true,"value":"■ AIKB","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"ChatPlayground Al...","depth":2,"bounds":{"left":0.05896318,"top":0.20438537,"width":0.06831395,"height":0.011643971},"on_screen":true,"value":"ChatPlayground Al...","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"M\nGMail","depth":2,"bounds":{"left":0.22756784,"top":0.20438537,"width":0.033430234,"height":0.0116332},"on_screen":true,"value":"M\nGMail","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Apps","depth":2,"bounds":{"left":0.54006785,"top":0.20438537,"width":0.020348836,"height":0.011633199},"on_screen":true,"value":"Apps","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Jiminny ~","depth":2,"bounds":{"left":0.018265504,"top":0.2392742,"width":0.030523255,"height":0.011643971},"on_screen":true,"value":"Jiminny ~","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Content Explorer","depth":2,"bounds":{"left":0.019718995,"top":0.27145937,"width":0.049418602,"height":0.012031744},"on_screen":true,"value":"Content Explorer","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Data Explorer","depth":2,"bounds":{"left":0.019718992,"top":0.3160641,"width":0.039244186,"height":0.011719371},"on_screen":true,"value":"Data Explorer","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"\" Notifications","depth":2,"bounds":{"left":0.008091087,"top":0.3393305,"width":0.049418602,"height":0.011697828},"on_screen":true,"value":"\" Notifications","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"* Email Manager","depth":2,"bounds":{"left":0.008091086,"top":0.36259687,"width":0.05523256,"height":0.011676285},"on_screen":true,"value":"* Email Manager","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Sections -","depth":2,"bounds":{"left":0.0066376,"top":0.41808078,"width":0.029069765,"height":0.007335378},"on_screen":true,"value":"Sections -","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"CS Day-to-day *\nGetting started Guide\n€ Just CS Data","depth":2,"bounds":{"left":0.02262597,"top":0.439376,"width":0.06976744,"height":0.055839356},"on_screen":true,"lines":[{"char_start":0,"char_count":16,"bounds":{"left":0.022625972,"top":0.439376,"width":0.05087209,"height":0.013959839}},{"char_start":16,"char_count":22,"bounds":{"left":0.02262597,"top":0.4626424,"width":0.06976744,"height":0.013959839}},{"char_start":38,"char_count":14,"bounds":{"left":0.024079459,"top":0.48334518,"width":0.04505814,"height":0.011870172}}],"value":"CS Day-to-day *\nGetting started Guide\n€ Just CS Data","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"E\n田\nH","depth":2,"bounds":{"left":0.008091086,"top":0.5254617,"width":0.00872093,"height":0.055839356},"on_screen":true,"lines":[{"char_start":0,"char_count":2,"bounds":{"left":0.008091086,"top":0.5254617,"width":0.00872093,"height":0.013959839}},{"char_start":2,"char_count":2,"bounds":{"left":0.008091086,"top":0.54640144,"width":0.00872093,"height":0.013959839}},{"char_start":4,"char_count":1,"bounds":{"left":0.008091086,"top":0.5673412,"width":0.0072674416,"height":0.013959839}}],"value":"E\n田\nH","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"* Daily Operations\n• Weekly prep\n• Renewals and Upsell\nRisk and Churn Analytics","depth":2,"bounds":{"left":0.024079457,"top":0.50659007,"width":0.07848837,"height":0.07509877},"on_screen":true,"lines":[{"char_start":0,"char_count":19,"bounds":{"left":0.02407946,"top":0.50659007,"width":0.055232555,"height":0.011891715}},{"char_start":19,"char_count":14,"bounds":{"left":0.024079457,"top":0.52536476,"width":0.04360465,"height":0.014304527}},{"char_start":33,"char_count":22,"bounds":{"left":0.024079459,"top":0.5486096,"width":0.06540697,"height":0.011751685}},{"char_start":55,"char_count":24,"bounds":{"left":0.024079459,"top":0.5696678,"width":0.07848837,"height":0.012020973}}],"value":"* Daily Operations\n• Weekly prep\n• Renewals and Upsell\nRisk and Churn Analytics","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"目","depth":2,"bounds":{"left":0.008091086,"top":0.6255072,"width":0.00872093,"height":0.013959839},"on_screen":true,"value":"目","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Implementation\nImpl Projects\nTrial Opps (Under Review)\nStoyan's clients","depth":2,"bounds":{"left":0.02262597,"top":0.6045674,"width":0.074127905,"height":0.07677912},"on_screen":true,"lines":[{"char_start":0,"char_count":15,"bounds":{"left":0.02262597,"top":0.6045674,"width":0.05232558,"height":0.011633199}},{"char_start":15,"char_count":14,"bounds":{"left":0.02262597,"top":0.62549645,"width":0.037790697,"height":0.014304527}},{"char_start":29,"char_count":26,"bounds":{"left":0.02262597,"top":0.64605916,"width":0.074127905,"height":0.014347613}},{"char_start":55,"char_count":16,"bounds":{"left":0.02262597,"top":0.669304,"width":0.04505814,"height":0.012042515}}],"value":"Implementation\nImpl Projects\nTrial Opps (Under Review)\nStoyan's clients","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Leadership","depth":2,"bounds":{"left":0.02262597,"top":0.704613,"width":0.040697675,"height":0.011633199},"on_screen":true,"value":"Leadership","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"E","depth":2,"bounds":{"left":0.008091086,"top":0.74649245,"width":0.0072674416,"height":0.013959839},"on_screen":true,"value":"E","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"• System Reports\nLeadership Operations\nPortfolio Overview (Dashbo….\nNPS Report - Greg\nClient Engagement Overview\nRevenue Analytics","depth":2,"bounds":{"left":0.02262597,"top":0.72787935,"width":0.08284883,"height":0.11665514},"on_screen":true,"lines":[{"char_start":0,"char_count":17,"bounds":{"left":0.024079457,"top":0.72787935,"width":0.05232558,"height":0.012053288}},{"char_start":17,"char_count":22,"bounds":{"left":0.022625972,"top":0.7488191,"width":0.06540697,"height":0.011676285}},{"char_start":39,"char_count":29,"bounds":{"left":0.022625973,"top":0.7694357,"width":0.08284883,"height":0.011956344}},{"char_start":68,"char_count":18,"bounds":{"left":0.02262597,"top":0.79069865,"width":0.05232558,"height":0.011816314}},{"char_start":86,"char_count":27,"bounds":{"left":0.022625972,"top":0.81145525,"width":0.08139534,"height":0.011816314}},{"char_start":113,"char_count":17,"bounds":{"left":0.02262597,"top":0.8325781,"width":0.05232558,"height":0.011956344}}],"value":"• System Reports\nLeadership Operations\nPortfolio Overview (Dashbo….\nNPS Report - Greg\nClient Engagement Overview\nRevenue Analytics","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Jiminny - Calenda...","depth":2,"bounds":{"left":0.14907946,"top":0.20438537,"width":0.06686046,"height":0.011643971},"on_screen":true,"value":"Jiminny - Calenda...","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"My Calendly - Eve...","depth":2,"bounds":{"left":0.2813469,"top":0.20438537,"width":0.06686046,"height":0.011643971},"on_screen":true,"value":"My Calendly - Eve...","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"= PH New Ul Login","depth":2,"bounds":{"left":0.35983527,"top":0.20438537,"width":0.06976744,"height":0.011643971},"on_screen":true,"value":"= PH New Ul Login","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Get Starting with J...","depth":2,"bounds":{"left":0.44849807,"top":0.20438537,"width":0.06976744,"height":0.011643971},"on_screen":true,"value":"Get Starting with J...","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Search Jiminny","depth":2,"bounds":{"left":0.30314922,"top":0.2392742,"width":0.04505814,"height":0.011643971},"on_screen":true,"value":"Search Jiminny","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"8 Metric ~","depth":2,"bounds":{"left":0.13302368,"top":0.26908678,"width":0.03501855,"height":0.014848864},"on_screen":true,"value":"8 Metric ~","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"@ Dataset","depth":2,"bounds":{"left":0.18396318,"top":0.26953128,"width":0.03197674,"height":0.011762457},"on_screen":true,"value":"@ Dataset","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"playbackVisited\nser","depth":2,"bounds":{"left":0.31332365,"top":0.26720464,"width":0.04505814,"height":0.0232664},"on_screen":true,"lines":[{"char_start":0,"char_count":16,"bounds":{"left":0.31332365,"top":0.26720464,"width":0.04505814,"height":0.009306559}},{"char_start":16,"char_count":3,"bounds":{"left":0.32495156,"top":0.27883786,"width":0.013081395,"height":0.011633199}}],"value":"playbackVisited\nser","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Q PLAYBACK","depth":2,"bounds":{"left":0.13309109,"top":0.3018565,"width":0.039244186,"height":0.011880944},"on_screen":true,"value":"Q PLAYBACK","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"+ Metric","depth":2,"bounds":{"left":0.24789931,"top":0.3019978,"width":0.02765101,"height":0.011846064},"on_screen":true,"value":"+ Metric","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"activities.playbackVisited","depth":2,"bounds":{"left":0.29733527,"top":0.30443087,"width":0.07122093,"height":0.011633199},"on_screen":true,"value":"activities.playbackVisited","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Name","depth":2,"bounds":{"left":0.15053295,"top":0.33235055,"width":0.018895349,"height":0.009306559},"on_screen":true,"value":"Name","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Tyr","depth":2,"bounds":{"left":0.2813469,"top":0.3300239,"width":0.011627907,"height":0.013959839},"on_screen":true,"value":"Tyr","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Overview","depth":2,"bounds":{"left":0.29878876,"top":0.33700386,"width":0.029069766,"height":0.011633199},"on_screen":true,"value":"Overview","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Raw Data","depth":2,"bounds":{"left":0.332219,"top":0.33672377,"width":0.029069766,"height":0.009834362},"on_screen":true,"value":"Raw Data","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Trace","depth":2,"bounds":{"left":0.3671027,"top":0.33700386,"width":0.01744186,"height":0.009306559},"on_screen":true,"value":"Trace","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Company 2","depth":2,"bounds":{"left":0.15489341,"top":0.3579436,"width":0.039244186,"height":0.0118594},"on_screen":true,"value":"Company 2","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"• Playback Adoption Avg","depth":2,"bounds":{"left":0.14617248,"top":0.3881899,"width":0.074127905,"height":0.012010201},"on_screen":true,"value":"• Playback Adoption Avg","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Cal","depth":2,"bounds":{"left":0.2813469,"top":0.3881899,"width":0.010174419,"height":0.009306559},"on_screen":true,"value":"Cal","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Metrics","depth":2,"bounds":{"left":0.29878876,"top":0.37888336,"width":0.021802325,"height":0.009306559},"on_screen":true,"value":"Metrics","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"• Playback Adoption","depth":2,"bounds":{"left":0.14617248,"top":0.4161096,"width":0.0625,"height":0.011805543},"on_screen":true,"value":"• Playback Adoption","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"EndUser 4","depth":2,"bounds":{"left":0.1563469,"top":0.47172275,"width":0.03488372,"height":0.009834362},"on_screen":true,"value":"EndUser 4","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"JUsers Playback Adoption","depth":2,"bounds":{"left":0.15489341,"top":0.49943778,"width":0.075581394,"height":0.012064058},"on_screen":true,"value":"JUsers Playback Adoption","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Cal","depth":2,"bounds":{"left":0.2813469,"top":0.49986863,"width":0.010174418,"height":0.011633199},"on_screen":true,"value":"Cal","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Playback Adoption (Last 7 days)","depth":2,"bounds":{"left":0.15343992,"top":0.52778834,"width":0.09156977,"height":0.013959839},"on_screen":true,"value":"Playback Adoption (Last 7 days)","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Playback Adoption","depth":2,"bounds":{"left":0.15343992,"top":0.55803466,"width":0.055232555,"height":0.012031744},"on_screen":true,"value":"Playback Adoption","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Cal","depth":2,"bounds":{"left":0.2813469,"top":0.555708,"width":0.011627907,"height":0.011633199},"on_screen":true,"value":"Cal","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"playbackVisited","depth":2,"bounds":{"left":0.15489341,"top":0.5859543,"width":0.046511628,"height":0.0116332},"on_screen":true,"value":"playbackVisited","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Usi","depth":2,"bounds":{"left":0.2813469,"top":0.5859543,"width":0.010174419,"height":0.009306559},"on_screen":true,"value":"Usi","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Comments","depth":2,"bounds":{"left":0.29878876,"top":0.77906543,"width":0.030523255,"height":0.011633199},"on_screen":true,"value":"Comments","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Add a comment","depth":2,"bounds":{"left":0.3046027,"top":0.813965,"width":0.04505814,"height":0.011794772},"on_screen":true,"value":"Add a comment","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Chloe Onboarding…..","depth":2,"bounds":{"left":0.58367246,"top":0.20438537,"width":0.06976744,"height":0.011643971},"on_screen":true,"value":"Chloe Onboarding…..","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Filter by Company","depth":2,"bounds":{"left":0.59093994,"top":0.37874332,"width":0.05232558,"height":0.011773229},"on_screen":true,"value":"Filter by Company","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"WEEKS","depth":2,"bounds":{"left":0.5037306,"top":0.6511002,"width":0.029069766,"height":0.011633199},"on_screen":true,"value":"WEEKS","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"as a","depth":2,"bounds":{"left":0.54006785,"top":0.6511002,"width":0.014534883,"height":0.011945572},"on_screen":true,"value":"as a","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SUM","depth":2,"bounds":{"left":0.5589632,"top":0.6511002,"width":0.023255814,"height":0.011633199},"on_screen":true,"value":"SUM","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"No groups found","depth":2,"bounds":{"left":0.5415213,"top":0.7022863,"width":0.049418602,"height":0.011719371},"on_screen":true,"value":"No groups found","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"+ Show full list","depth":2,"bounds":{"left":0.5444283,"top":0.7371859,"width":0.04505814,"height":0.011687057},"on_screen":true,"value":"+ Show full list","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"の","depth":2,"bounds":{"left":0.6999515,"top":0.095033295,"width":0.010174419,"height":0.011633199},"on_screen":true,"value":"の","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"u User","depth":2,"bounds":{"left":0.644719,"top":0.12752008,"width":0.03343023,"height":0.011719371},"on_screen":true,"value":"u User","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"New","depth":2,"bounds":{"left":0.70140505,"top":0.12760626,"width":0.018895349,"height":0.011633199},"on_screen":true,"value":"New","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"+ CX Journey SMB...","depth":2,"bounds":{"left":0.66070735,"top":0.20172481,"width":0.075581394,"height":0.016986625},"on_screen":true,"value":"+ CX Journey SMB...","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"+","depth":2,"bounds":{"left":0.772626,"top":0.048500497,"width":0.013081395,"height":0.020939758},"on_screen":true,"value":"+","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"8•\nMon 11 May 12:20","depth":2,"bounds":{"left":0.74210274,"top":0.0926528,"width":0.093023255,"height":0.016340336},"on_screen":true,"value":"8•\nMon 11 May 12:20","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"i User","depth":2,"bounds":{"left":0.7362888,"top":0.1299329,"width":0.030523254,"height":0.0074215503},"on_screen":true,"value":"i User","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"ロ","depth":2,"bounds":{"left":0.7435562,"top":0.16483249,"width":0.011627907,"height":0.020939758},"on_screen":true,"value":"ロ","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"E Work","depth":2,"bounds":{"left":0.7798934,"top":0.16685753,"width":0.031976745,"height":0.014304527},"on_screen":true,"value":"E Work","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"X","depth":2,"bounds":{"left":0.8569283,"top":0.048500497,"width":0.011627907,"height":0.018613119},"on_screen":true,"value":"X","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Petko","depth":2,"bounds":{"left":0.8191376,"top":0.23928496,"width":0.018895349,"height":0.011633199},"on_screen":true,"value":"Petko","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"Feb 11, 2026 - May 10, 2026","depth":2,"bounds":{"left":0.73919576,"top":0.37655672,"width":0.0872093,"height":0.013959839},"on_screen":true,"value":"Feb 11, 2026 - May 10, 2026","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"7= Al Notes: Off","depth":2,"bounds":{"left":0.769719,"top":0.7068534,"width":0.056686044,"height":0.014304527},"on_screen":true,"value":"7= Al Notes: Off","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"zoom","depth":2,"bounds":{"left":0.10111434,"top":0.89074415,"width":0.021802325,"height":0.009306559},"on_screen":true,"value":"zoom","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"田","depth":2,"bounds":{"left":0.17088178,"top":0.8860909,"width":0.014534883,"height":0.0232664},"on_screen":true,"value":"田","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"A","depth":2,"bounds":{"left":0.2711725,"top":0.8814376,"width":0.015988372,"height":0.027919678},"on_screen":true,"value":"A","role_description":"text entry area","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-7996815017829852588
|
-329316701668764047
|
click
|
accessibility
|
NULL
|
Petko Kashinski
Screen share
Chrome
File
Edit
View Petko Kashinski
Screen share
Chrome
File
Edit
View
History
Bookmarks
Profiles
Tab
Window
Help
分
*
Work
Gree
Score
andre
@ wilso
Call A
Jimin
M Inbox
NX
ニ Apps
Build
ws.planhat.com/jiminny/home/data-explorer/usagemetricdef?preview=UsageMetricDef.674543e45a4792694fe994e5
★
u
■ AIKB
ChatPlayground Al...
M
GMail
Apps
Jiminny ~
Content Explorer
Data Explorer
" Notifications
* Email Manager
Sections -
CS Day-to-day *
Getting started Guide
€ Just CS Data
E
田
H
* Daily Operations
• Weekly prep
• Renewals and Upsell
Risk and Churn Analytics
目
Implementation
Impl Projects
Trial Opps (Under Review)
Stoyan's clients
Leadership
E
• System Reports
Leadership Operations
Portfolio Overview (Dashbo….
NPS Report - Greg
Client Engagement Overview
Revenue Analytics
Jiminny - Calenda...
My Calendly - Eve...
= PH New Ul Login
Get Starting with J...
Search Jiminny
8 Metric ~
@ Dataset
playbackVisited
ser
Q PLAYBACK
+ Metric
activities.playbackVisited
Name
Tyr
Overview
Raw Data
Trace
Company 2
• Playback Adoption Avg
Cal
Metrics
• Playback Adoption
EndUser 4
JUsers Playback Adoption
Cal
Playback Adoption (Last 7 days)
Playback Adoption
Cal
playbackVisited
Usi
Comments
Add a comment
Chloe Onboarding…..
Filter by Company
WEEKS
as a
SUM
No groups found
+ Show full list
の
u User
New
+ CX Journey SMB...
+
8•
Mon 11 May 12:20
i User
ロ
E Work
X
Petko
Feb 11, 2026 - May 10, 2026
7= Al Notes: Off
zoom
田
A...
|
22898
|
/Volumes/Work/2026/PLanhat Petko interest event 20 /Volumes/Work/2026/PLanhat Petko interest event 2026-05-11.mp4...
|
NULL
|
NULL
|
|
22837
|
977
|
52
|
2026-05-12T07:22:44.075699+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778570564075_m2.jpg...
|
PhpStorm
|
faVsco.js – UserAutomatedReportsController.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
14
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\API\UserAutomatedReports;
use Illuminate\Support\Carbon;
use Illuminate\Http\JsonResponse;
use Jiminny\Exceptions\ApplicationException;
use Jiminny\Http\Controllers\Controller;
use Jiminny\Http\Responses\Api\Response;
use Jiminny\Models\User;
use Jiminny\Repositories\AutomatedReportsRepository;
use Jiminny\Services\ApiResponseService;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
use Jiminny\Services\PlanhatService;
use Illuminate\Http\Request;
use Throwable;
class UserAutomatedReportsController extends Controller
{
public const int RESULTS_PER_PAGE = 25;
public const string SORT_COLUMN = 'sort_column';
public const string SORT_DIRECTION = 'sort_direction';
public function __construct(
private readonly AutomatedReportsRepository $automatedReportsRepository,
private readonly AutomatedReportsService $automatedReportsService,
private readonly ApiResponseService $apiResponseService,
private readonly Response $response,
private readonly PlanhatService $planhatService,
) {
parent::__construct();
}
public function trackInterest(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
defer(
fn () => $this->planhatService->track(
user: $user,
event: 'automated-reports-track-interest',
)
)->always();
return $this->response->withOk();
}
/**
* @throws ApplicationException
*/
public function list(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
$teamIds = $request->has('team')
? (array) $request->get('team')
: [];
$reportTypes = $request->has('report_type')
? (array) $request->get('report_type')
: [];
$name = $request->has('name') ? trim($request->get('name', '')) : null;
try {
$fromDate = $request->has('from_date') ? Carbon::parse($request->get('from_date')) : null;
$toDate = $request->has('to_date') ? Carbon::parse($request->get('to_date')) : null;
} catch (\Exception) {
return $this->response->errorWrongArgs('Invalid date.');
}
$page = $request->has('page') ? (int) $request->get('page') : 1;
$sort = ReportSort::tryFrom(
$request->get(self::SORT_COLUMN, '')
) ?? ReportSort::GENERATED_AT;
$sortDirection = ReportSortDirection::tryFrom(
strtolower($request->get(self::SORT_DIRECTION, ''))
) ?? ReportSortDirection::DESC;
$paginatedUserReports = $this->automatedReportsRepository->getPaginatedUserReports(
user: $user,
sort: $sort,
sortDirection: $sortDirection,
resultsPerPage: self::RESULTS_PER_PAGE,
page: $page,
fromDate: $fromDate,
toDate: $toDate,
teamIds: array_map('intval', $teamIds),
reportTypes: $reportTypes,
name: $name,
);
$reportResults = $this->automatedReportsService->transformReportResults(
$paginatedUserReports->getCollection()
);
$team = $user->getTeam();
$reportTypeFilter = $this->automatedReportsService->getReportTypeFieldData(
shortVersion: true,
team: $team
);
$data = $this->apiResponseService->fromPaginatorToArray(
paginator: $paginatedUserReports,
data: $reportResults,
moreMeta: [
self::SORT_COLUMN => $sort->value,
self::SORT_DIRECTION => $sortDirection->value,
],
filters: [
$reportTypeFilter['id'] => $reportTypeFilter,
],
);
return $this->response->withArray($data);
}
public function delete(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$result = $this->automatedReportsRepository->findResultByUuidForUser($uuid, $user);
if ($result === null) {
return new JsonResponse(
data: ['error' => 'Report not found'],
status: JsonResponse::HTTP_NOT_FOUND
);
}
$result->delete();
return new JsonResponse(null, JsonResponse::HTTP_NO_CONTENT);
} catch (Throwable $e) {
return new JsonResponse(
data: ['error' => 'Failed to delete report result'],
status: JsonResponse::HTTP_INTERNAL_SERVER_ERROR
);
}
}
}...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"14","depth":4,"bounds":{"left":0.3899601,"top":0.07581804,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.40159574,"top":0.07581804,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.4112367,"top":0.074221864,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.41855052,"top":0.074221864,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Http\\Controllers\\API\\UserAutomatedReports;\n\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Http\\JsonResponse;\nuse Jiminny\\Exceptions\\ApplicationException;\nuse Jiminny\\Http\\Controllers\\Controller;\nuse Jiminny\\Http\\Responses\\Api\\Response;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\AutomatedReportsRepository;\nuse Jiminny\\Services\\ApiResponseService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\nuse Jiminny\\Services\\PlanhatService;\nuse Illuminate\\Http\\Request;\nuse Throwable;\n\nclass UserAutomatedReportsController extends Controller\n{\n public const int RESULTS_PER_PAGE = 25;\n\n public const string SORT_COLUMN = 'sort_column';\n\n public const string SORT_DIRECTION = 'sort_direction';\n\n public function __construct(\n private readonly AutomatedReportsRepository $automatedReportsRepository,\n private readonly AutomatedReportsService $automatedReportsService,\n private readonly ApiResponseService $apiResponseService,\n private readonly Response $response,\n private readonly PlanhatService $planhatService,\n ) {\n parent::__construct();\n }\n\n public function trackInterest(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n defer(\n fn () => $this->planhatService->track(\n user: $user,\n event: 'automated-reports-track-interest',\n )\n )->always();\n\n return $this->response->withOk();\n }\n\n /**\n * @throws ApplicationException\n */\n public function list(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n $teamIds = $request->has('team')\n ? (array) $request->get('team')\n : [];\n $reportTypes = $request->has('report_type')\n ? (array) $request->get('report_type')\n : [];\n $name = $request->has('name') ? trim($request->get('name', '')) : null;\n\n try {\n $fromDate = $request->has('from_date') ? Carbon::parse($request->get('from_date')) : null;\n $toDate = $request->has('to_date') ? Carbon::parse($request->get('to_date')) : null;\n } catch (\\Exception) {\n return $this->response->errorWrongArgs('Invalid date.');\n }\n\n $page = $request->has('page') ? (int) $request->get('page') : 1;\n $sort = ReportSort::tryFrom(\n $request->get(self::SORT_COLUMN, '')\n ) ?? ReportSort::GENERATED_AT;\n $sortDirection = ReportSortDirection::tryFrom(\n strtolower($request->get(self::SORT_DIRECTION, ''))\n ) ?? ReportSortDirection::DESC;\n\n $paginatedUserReports = $this->automatedReportsRepository->getPaginatedUserReports(\n user: $user,\n sort: $sort,\n sortDirection: $sortDirection,\n resultsPerPage: self::RESULTS_PER_PAGE,\n page: $page,\n fromDate: $fromDate,\n toDate: $toDate,\n teamIds: array_map('intval', $teamIds),\n reportTypes: $reportTypes,\n name: $name,\n );\n\n $reportResults = $this->automatedReportsService->transformReportResults(\n $paginatedUserReports->getCollection()\n );\n $team = $user->getTeam();\n $reportTypeFilter = $this->automatedReportsService->getReportTypeFieldData(\n shortVersion: true,\n team: $team\n );\n\n $data = $this->apiResponseService->fromPaginatorToArray(\n paginator: $paginatedUserReports,\n data: $reportResults,\n moreMeta: [\n self::SORT_COLUMN => $sort->value,\n self::SORT_DIRECTION => $sortDirection->value,\n ],\n filters: [\n $reportTypeFilter['id'] => $reportTypeFilter,\n ],\n );\n\n return $this->response->withArray($data);\n }\n\n public function delete(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $result = $this->automatedReportsRepository->findResultByUuidForUser($uuid, $user);\n\n if ($result === null) {\n return new JsonResponse(\n data: ['error' => 'Report not found'],\n status: JsonResponse::HTTP_NOT_FOUND\n );\n }\n\n $result->delete();\n\n return new JsonResponse(null, JsonResponse::HTTP_NO_CONTENT);\n } catch (Throwable $e) {\n return new JsonResponse(\n data: ['error' => 'Failed to delete report result'],\n status: JsonResponse::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n}","depth":4,"bounds":{"left":0.122340426,"top":0.0,"width":0.30319148,"height":1.0},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Http\\Controllers\\API\\UserAutomatedReports;\n\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Http\\JsonResponse;\nuse Jiminny\\Exceptions\\ApplicationException;\nuse Jiminny\\Http\\Controllers\\Controller;\nuse Jiminny\\Http\\Responses\\Api\\Response;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\AutomatedReportsRepository;\nuse Jiminny\\Services\\ApiResponseService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\nuse Jiminny\\Services\\PlanhatService;\nuse Illuminate\\Http\\Request;\nuse Throwable;\n\nclass UserAutomatedReportsController extends Controller\n{\n public const int RESULTS_PER_PAGE = 25;\n\n public const string SORT_COLUMN = 'sort_column';\n\n public const string SORT_DIRECTION = 'sort_direction';\n\n public function __construct(\n private readonly AutomatedReportsRepository $automatedReportsRepository,\n private readonly AutomatedReportsService $automatedReportsService,\n private readonly ApiResponseService $apiResponseService,\n private readonly Response $response,\n private readonly PlanhatService $planhatService,\n ) {\n parent::__construct();\n }\n\n public function trackInterest(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n defer(\n fn () => $this->planhatService->track(\n user: $user,\n event: 'automated-reports-track-interest',\n )\n )->always();\n\n return $this->response->withOk();\n }\n\n /**\n * @throws ApplicationException\n */\n public function list(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n $teamIds = $request->has('team')\n ? (array) $request->get('team')\n : [];\n $reportTypes = $request->has('report_type')\n ? (array) $request->get('report_type')\n : [];\n $name = $request->has('name') ? trim($request->get('name', '')) : null;\n\n try {\n $fromDate = $request->has('from_date') ? Carbon::parse($request->get('from_date')) : null;\n $toDate = $request->has('to_date') ? Carbon::parse($request->get('to_date')) : null;\n } catch (\\Exception) {\n return $this->response->errorWrongArgs('Invalid date.');\n }\n\n $page = $request->has('page') ? (int) $request->get('page') : 1;\n $sort = ReportSort::tryFrom(\n $request->get(self::SORT_COLUMN, '')\n ) ?? ReportSort::GENERATED_AT;\n $sortDirection = ReportSortDirection::tryFrom(\n strtolower($request->get(self::SORT_DIRECTION, ''))\n ) ?? ReportSortDirection::DESC;\n\n $paginatedUserReports = $this->automatedReportsRepository->getPaginatedUserReports(\n user: $user,\n sort: $sort,\n sortDirection: $sortDirection,\n resultsPerPage: self::RESULTS_PER_PAGE,\n page: $page,\n fromDate: $fromDate,\n toDate: $toDate,\n teamIds: array_map('intval', $teamIds),\n reportTypes: $reportTypes,\n name: $name,\n );\n\n $reportResults = $this->automatedReportsService->transformReportResults(\n $paginatedUserReports->getCollection()\n );\n $team = $user->getTeam();\n $reportTypeFilter = $this->automatedReportsService->getReportTypeFieldData(\n shortVersion: true,\n team: $team\n );\n\n $data = $this->apiResponseService->fromPaginatorToArray(\n paginator: $paginatedUserReports,\n data: $reportResults,\n moreMeta: [\n self::SORT_COLUMN => $sort->value,\n self::SORT_DIRECTION => $sortDirection->value,\n ],\n filters: [\n $reportTypeFilter['id'] => $reportTypeFilter,\n ],\n );\n\n return $this->response->withArray($data);\n }\n\n public function delete(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $result = $this->automatedReportsRepository->findResultByUuidForUser($uuid, $user);\n\n if ($result === null) {\n return new JsonResponse(\n data: ['error' => 'Report not found'],\n status: JsonResponse::HTTP_NOT_FOUND\n );\n }\n\n $result->delete();\n\n return new JsonResponse(null, JsonResponse::HTTP_NO_CONTENT);\n } catch (Throwable $e) {\n return new JsonResponse(\n data: ['error' => 'Failed to delete report result'],\n status: JsonResponse::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false}]...
|
-7995423086579261202
|
-2619102745400854003
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
14
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\API\UserAutomatedReports;
use Illuminate\Support\Carbon;
use Illuminate\Http\JsonResponse;
use Jiminny\Exceptions\ApplicationException;
use Jiminny\Http\Controllers\Controller;
use Jiminny\Http\Responses\Api\Response;
use Jiminny\Models\User;
use Jiminny\Repositories\AutomatedReportsRepository;
use Jiminny\Services\ApiResponseService;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
use Jiminny\Services\PlanhatService;
use Illuminate\Http\Request;
use Throwable;
class UserAutomatedReportsController extends Controller
{
public const int RESULTS_PER_PAGE = 25;
public const string SORT_COLUMN = 'sort_column';
public const string SORT_DIRECTION = 'sort_direction';
public function __construct(
private readonly AutomatedReportsRepository $automatedReportsRepository,
private readonly AutomatedReportsService $automatedReportsService,
private readonly ApiResponseService $apiResponseService,
private readonly Response $response,
private readonly PlanhatService $planhatService,
) {
parent::__construct();
}
public function trackInterest(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
defer(
fn () => $this->planhatService->track(
user: $user,
event: 'automated-reports-track-interest',
)
)->always();
return $this->response->withOk();
}
/**
* @throws ApplicationException
*/
public function list(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
$teamIds = $request->has('team')
? (array) $request->get('team')
: [];
$reportTypes = $request->has('report_type')
? (array) $request->get('report_type')
: [];
$name = $request->has('name') ? trim($request->get('name', '')) : null;
try {
$fromDate = $request->has('from_date') ? Carbon::parse($request->get('from_date')) : null;
$toDate = $request->has('to_date') ? Carbon::parse($request->get('to_date')) : null;
} catch (\Exception) {
return $this->response->errorWrongArgs('Invalid date.');
}
$page = $request->has('page') ? (int) $request->get('page') : 1;
$sort = ReportSort::tryFrom(
$request->get(self::SORT_COLUMN, '')
) ?? ReportSort::GENERATED_AT;
$sortDirection = ReportSortDirection::tryFrom(
strtolower($request->get(self::SORT_DIRECTION, ''))
) ?? ReportSortDirection::DESC;
$paginatedUserReports = $this->automatedReportsRepository->getPaginatedUserReports(
user: $user,
sort: $sort,
sortDirection: $sortDirection,
resultsPerPage: self::RESULTS_PER_PAGE,
page: $page,
fromDate: $fromDate,
toDate: $toDate,
teamIds: array_map('intval', $teamIds),
reportTypes: $reportTypes,
name: $name,
);
$reportResults = $this->automatedReportsService->transformReportResults(
$paginatedUserReports->getCollection()
);
$team = $user->getTeam();
$reportTypeFilter = $this->automatedReportsService->getReportTypeFieldData(
shortVersion: true,
team: $team
);
$data = $this->apiResponseService->fromPaginatorToArray(
paginator: $paginatedUserReports,
data: $reportResults,
moreMeta: [
self::SORT_COLUMN => $sort->value,
self::SORT_DIRECTION => $sortDirection->value,
],
filters: [
$reportTypeFilter['id'] => $reportTypeFilter,
],
);
return $this->response->withArray($data);
}
public function delete(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$result = $this->automatedReportsRepository->findResultByUuidForUser($uuid, $user);
if ($result === null) {
return new JsonResponse(
data: ['error' => 'Report not found'],
status: JsonResponse::HTTP_NOT_FOUND
);
}
$result->delete();
return new JsonResponse(null, JsonResponse::HTTP_NO_CONTENT);
} catch (Throwable $e) {
return new JsonResponse(
data: ['error' => 'Failed to delete report result'],
status: JsonResponse::HTTP_INTERNAL_SERVER_ERROR
);
}
}
}...
|
22836
|
NULL
|
NULL
|
NULL
|
|
22751
|
976
|
10
|
2026-05-12T07:20:02.153379+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778570402153_m1.jpg...
|
Firefox
|
Content Explorer — Work
|
True
|
ws.planhat.com/jiminny/home/content-explorer
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20773] User Pilot not receiving events on report generated - Jira
[JY-20773] User Pilot not receiving events on report generated - Jira
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
[JY-20776] Automated report - sentry - Jira
[JY-20776] Automated report - sentry - Jira
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
JY-20625 | JY-20742 | MCP POC by yalokin-jiminny · Pull Request #12036 · jiminny/app
JY-20625 | JY-20742 | MCP POC by yalokin-jiminny · Pull Request #12036 · jiminny/app
LLM pricing overview with the most actual prices - Google Search
LLM pricing overview with the most actual prices - Google Search
Planhat
Planhat
Content Explorer
Content Explorer
Close tab
Login
Login
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New Chat
Open menu for conversation actions.
Conversation with Gemini
Conversation with Gemini
Copy prompt
Edit
You said I am on https://app-eu3.planhat.com/ how to get to ws.planhat.com
You said
I am on https://app-eu3.planhat.com/ how to get to ws.planhat.com
Listen
Gemini said
Gemini said
To get to
ws.planhat.com
(which is the address for the "Upgraded Planhat" or "Next Generation" interface) while you are currently on the EU regional server (
app-eu3.planhat.com
), you have two primary options:
1. The Manual URL Change
1. The Manual URL Change
Because Planhat uses specific subdomains for different versions and regions, you can try navigating directly. However, note that
ws.planhat.com
is a global entry point for the upgraded platform.
Try navigating to:
https://ws.planhat.com
https://ws.planhat.com
If your account has been migrated to the upgraded version, it should recognize your session or prompt you to log in.
Note:
If your data is specifically hosted on the
eu3
cluster, the system may automatically redirect you to a regional version of the upgraded UI (e.g.,
ws-eu3.planhat.com
).
2. The In-App "Switch" (If Available)
2. The In-App "Switch" (If Available)
If your tenant is eligible for the upgrade but you are still in the classic "app" view, look for these UI elements:
The Top Gray Bar:
Click on your
Tenant Name/Logo
in the top-left corner. This often opens the "Global Tools" menu.
Upgrade Prompts:
In some instances, Planhat places a "Try the new Planhat" or "Upgraded Planhat" toggle in the Help menu (the
"?" icon
in the top right) or as a banner at the top of the screen.
Why use ws.planhat.com?
Why use ws.planhat.com?
You likely need this URL to access newer "Global Tools" and features that are only available in the upgraded version, such as:
Data Model Manager:
For advanced field and object configuration.
Portal Manager:
To manage customer-facing portals....
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20773] User Pilot not receiving events on report generated - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20773] User Pilot not receiving events on report generated - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20776] Automated report - sentry - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20776] Automated report - sentry - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20625 | JY-20742 | MCP POC by yalokin-jiminny · Pull Request #12036 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20625 | JY-20742 | MCP POC by yalokin-jiminny · Pull Request #12036 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"LLM pricing overview with the most actual prices - Google Search","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LLM pricing overview with the most actual prices - Google Search","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Planhat","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Planhat","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Content Explorer","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Content Explorer","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Login","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Login","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Close Google Gemini (⌃X)","depth":6,"bounds":{"left":0.0,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.0,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.019097222,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.04236111,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Chat settings","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"WORK, Google Account: lukas.kovalik@jiminny.com","depth":12,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Main menu","depth":12,"on_screen":true,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Chat","depth":12,"on_screen":true,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open menu for conversation actions.","depth":12,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Conversation with Gemini","depth":15,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Conversation with Gemini","depth":16,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy prompt","depth":21,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Edit","depth":21,"on_screen":false,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"You said I am on https://app-eu3.planhat.com/ how to get to ws.planhat.com","depth":21,"on_screen":false,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You said","depth":23,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"I am on https://app-eu3.planhat.com/ how to get to ws.planhat.com","depth":23,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Listen","depth":22,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Gemini said","depth":20,"on_screen":false,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Gemini said","depth":21,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"To get to","depth":24,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ws.planhat.com","depth":24,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(which is the address for the \"Upgraded Planhat\" or \"Next Generation\" interface) while you are currently on the EU regional server (","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"app-eu3.planhat.com","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"), you have two primary options:","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"1. The Manual URL Change","depth":23,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1. The Manual URL Change","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Because Planhat uses specific subdomains for different versions and regions, you can try navigating directly. However, note that","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ws.planhat.com","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"is a global entry point for the upgraded platform.","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Try navigating to:","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"https://ws.planhat.com","depth":26,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"https://ws.planhat.com","depth":27,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"If your account has been migrated to the upgraded version, it should recognize your session or prompt you to log in.","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Note:","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"If your data is specifically hosted on the","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"eu3","depth":27,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cluster, the system may automatically redirect you to a regional version of the upgraded UI (e.g.,","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ws-eu3.planhat.com","depth":27,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":").","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"2. The In-App \"Switch\" (If Available)","depth":23,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2. The In-App \"Switch\" (If Available)","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"If your tenant is eligible for the upgrade but you are still in the classic \"app\" view, look for these UI elements:","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The Top Gray Bar:","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Click on your","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tenant Name/Logo","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"in the top-left corner. This often opens the \"Global Tools\" menu.","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Upgrade Prompts:","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"In some instances, Planhat places a \"Try the new Planhat\" or \"Upgraded Planhat\" toggle in the Help menu (the","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"?\" icon","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"in the top right) or as a banner at the top of the screen.","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Why use ws.planhat.com?","depth":23,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Why use ws.planhat.com?","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You likely need this URL to access newer \"Global Tools\" and features that are only available in the upgraded version, such as:","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Data Model Manager:","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"For advanced field and object configuration.","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Portal Manager:","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"To manage customer-facing portals.","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-7995183100152167652
|
-2733383493890377010
|
click
|
accessibility
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20773] User Pilot not receiving events on report generated - Jira
[JY-20773] User Pilot not receiving events on report generated - Jira
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
[JY-20776] Automated report - sentry - Jira
[JY-20776] Automated report - sentry - Jira
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
JY-20625 | JY-20742 | MCP POC by yalokin-jiminny · Pull Request #12036 · jiminny/app
JY-20625 | JY-20742 | MCP POC by yalokin-jiminny · Pull Request #12036 · jiminny/app
LLM pricing overview with the most actual prices - Google Search
LLM pricing overview with the most actual prices - Google Search
Planhat
Planhat
Content Explorer
Content Explorer
Close tab
Login
Login
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New Chat
Open menu for conversation actions.
Conversation with Gemini
Conversation with Gemini
Copy prompt
Edit
You said I am on https://app-eu3.planhat.com/ how to get to ws.planhat.com
You said
I am on https://app-eu3.planhat.com/ how to get to ws.planhat.com
Listen
Gemini said
Gemini said
To get to
ws.planhat.com
(which is the address for the "Upgraded Planhat" or "Next Generation" interface) while you are currently on the EU regional server (
app-eu3.planhat.com
), you have two primary options:
1. The Manual URL Change
1. The Manual URL Change
Because Planhat uses specific subdomains for different versions and regions, you can try navigating directly. However, note that
ws.planhat.com
is a global entry point for the upgraded platform.
Try navigating to:
https://ws.planhat.com
https://ws.planhat.com
If your account has been migrated to the upgraded version, it should recognize your session or prompt you to log in.
Note:
If your data is specifically hosted on the
eu3
cluster, the system may automatically redirect you to a regional version of the upgraded UI (e.g.,
ws-eu3.planhat.com
).
2. The In-App "Switch" (If Available)
2. The In-App "Switch" (If Available)
If your tenant is eligible for the upgrade but you are still in the classic "app" view, look for these UI elements:
The Top Gray Bar:
Click on your
Tenant Name/Logo
in the top-left corner. This often opens the "Global Tools" menu.
Upgrade Prompts:
In some instances, Planhat places a "Try the new Planhat" or "Upgraded Planhat" toggle in the Help menu (the
"?" icon
in the top right) or as a banner at the top of the screen.
Why use ws.planhat.com?
Why use ws.planhat.com?
You likely need this URL to access newer "Global Tools" and features that are only available in the upgraded version, such as:
Data Model Manager:
For advanced field and object configuration.
Portal Manager:
To manage customer-facing portals....
|
NULL
|
NULL
|
NULL
|
NULL
|
|
22783
|
976
|
27
|
2026-05-12T07:20:58.202725+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-12/1778 /Users/lukas/.screenpipe/data/data/2026-05-12/1778570458202_m1.jpg...
|
Firefox
|
Content Explorer — Work
|
True
|
ws.planhat.com/jiminny/home/content-explorer
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20773] User Pilot not receiving events on report generated - Jira
[JY-20773] User Pilot not receiving events on report generated - Jira
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
[JY-20776] Automated report - sentry - Jira
[JY-20776] Automated report - sentry - Jira
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
JY-20625 | JY-20742 | MCP POC by yalokin-jiminny · Pull Request #12036 · jiminny/app
JY-20625 | JY-20742 | MCP POC by yalokin-jiminny · Pull Request #12036 · jiminny/app
LLM pricing overview with the most actual prices - Google Search
LLM pricing overview with the most actual prices - Google Search
Planhat
Planhat
Content Explorer
Content Explorer
Close tab
Login
Login
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New Chat
Open menu for conversation actions.
Conversation with Gemini
Conversation with Gemini
Copy prompt
Edit
You said I am on https://app-eu3.planhat.com/ how to get to ws.planhat.com
You said
I am on https://app-eu3.planhat.com/ how to get to ws.planhat.com
Listen
Gemini said
Gemini said
To get to
ws.planhat.com
(which is the address for the "Upgraded Planhat" or "Next Generation" interface) while you are currently on the EU regional server (
app-eu3.planhat.com
), you have two primary options:
1. The Manual URL Change
1. The Manual URL Change
Because Planhat uses specific subdomains for different versions and regions, you can try navigating directly. However, note that
ws.planhat.com
is a global entry point for the upgraded platform.
Try navigating to:
https://ws.planhat.com
https://ws.planhat.com
If your account has been migrated to the upgraded version, it should recognize your session or prompt you to log in.
Note:
If your data is specifically hosted on the
eu3
cluster, the system may automatically redirect you to a regional version of the upgraded UI (e.g.,
ws-eu3.planhat.com
).
2. The In-App "Switch" (If Available)
2. The In-App "Switch" (If Available)
If your tenant is eligible for the upgrade but you are still in the classic "app" view, look for these UI elements:
The Top Gray Bar:
Click on your
Tenant Name/Logo
in the top-left corner. This often opens the "Global Tools" menu.
Upgrade Prompts:
In some instances, Planhat places a "Try the new Planhat" or "Upgraded Planhat" toggle in the Help menu (the
"?" icon
in the top right) or as a banner at the top of the screen.
Why use ws.planhat.com?
Why use ws.planhat.com?
You likely need this URL to access newer "Global Tools" and features that are only available in the upgraded version, such as:
Data Model Manager:
For advanced field and object configuration.
Portal Manager:
To manage customer-facing portals....
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20773] User Pilot not receiving events on report generated - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20773] User Pilot not receiving events on report generated - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20776] Automated report - sentry - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20776] Automated report - sentry - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"TypeError: League\\Flysystem\\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20625 | JY-20742 | MCP POC by yalokin-jiminny · Pull Request #12036 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20625 | JY-20742 | MCP POC by yalokin-jiminny · Pull Request #12036 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"LLM pricing overview with the most actual prices - Google Search","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LLM pricing overview with the most actual prices - Google Search","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Planhat","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Planhat","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Content Explorer","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Content Explorer","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"Login","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Login","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Close Google Gemini (⌃X)","depth":6,"bounds":{"left":0.0,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.0,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.019097222,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.04236111,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Chat settings","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":7,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"WORK, Google Account: lukas.kovalik@jiminny.com","depth":12,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Main menu","depth":12,"on_screen":true,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Chat","depth":12,"on_screen":true,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open menu for conversation actions.","depth":12,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Conversation with Gemini","depth":15,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Conversation with Gemini","depth":16,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy prompt","depth":21,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Edit","depth":21,"on_screen":false,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"You said I am on https://app-eu3.planhat.com/ how to get to ws.planhat.com","depth":21,"on_screen":false,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You said","depth":23,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"I am on https://app-eu3.planhat.com/ how to get to ws.planhat.com","depth":23,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Listen","depth":22,"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Gemini said","depth":20,"on_screen":false,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Gemini said","depth":21,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"To get to","depth":24,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ws.planhat.com","depth":24,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(which is the address for the \"Upgraded Planhat\" or \"Next Generation\" interface) while you are currently on the EU regional server (","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"app-eu3.planhat.com","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"), you have two primary options:","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"1. The Manual URL Change","depth":23,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1. The Manual URL Change","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Because Planhat uses specific subdomains for different versions and regions, you can try navigating directly. However, note that","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ws.planhat.com","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"is a global entry point for the upgraded platform.","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Try navigating to:","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"https://ws.planhat.com","depth":26,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"https://ws.planhat.com","depth":27,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"If your account has been migrated to the upgraded version, it should recognize your session or prompt you to log in.","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Note:","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"If your data is specifically hosted on the","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"eu3","depth":27,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cluster, the system may automatically redirect you to a regional version of the upgraded UI (e.g.,","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"ws-eu3.planhat.com","depth":27,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":").","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"2. The In-App \"Switch\" (If Available)","depth":23,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2. The In-App \"Switch\" (If Available)","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"If your tenant is eligible for the upgrade but you are still in the classic \"app\" view, look for these UI elements:","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The Top Gray Bar:","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Click on your","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tenant Name/Logo","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"in the top-left corner. This often opens the \"Global Tools\" menu.","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Upgrade Prompts:","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"In some instances, Planhat places a \"Try the new Planhat\" or \"Upgraded Planhat\" toggle in the Help menu (the","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"\"?\" icon","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"in the top right) or as a banner at the top of the screen.","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Why use ws.planhat.com?","depth":23,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Why use ws.planhat.com?","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You likely need this URL to access newer \"Global Tools\" and features that are only available in the upgraded version, such as:","depth":24,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Data Model Manager:","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"For advanced field and object configuration.","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Portal Manager:","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"To manage customer-facing portals.","depth":26,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-7995183100152167652
|
-2733383493890377010
|
click
|
accessibility
|
NULL
|
New Tab
New Tab
Jy 20820 es reindex stream model h New Tab
New Tab
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
Jy 20820 es reindex stream model hydration by Vasil-Jiminny · Pull Request #12059 · jiminny/app
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
[JY-20725] [HubSpot] Optimise CRM rematching on delete hubspot accounts/contacts - Jira
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
JY-20725 add HS rate limit handling on activities rematching by LakyLak · Pull Request #12066 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20773] User Pilot not receiving events on report generated - Jira
[JY-20773] User Pilot not receiving events on report generated - Jira
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
JY-20773 fix user pilot tracking ofr automated report generated by LakyLak · Pull Request #12024 · jiminny/app
[JY-20776] Automated report - sentry - Jira
[JY-20776] Automated report - sentry - Jira
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
TypeError: League\Flysystem\Filesystem::has(): Argument #1 ($location) must be of type string, null given, called in /home/jiminny/vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemAdapter.php on line 218 — jiminny — app
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 3 Q2 - Platform Team - Scrum Board - Jira
JY-20625 | JY-20742 | MCP POC by yalokin-jiminny · Pull Request #12036 · jiminny/app
JY-20625 | JY-20742 | MCP POC by yalokin-jiminny · Pull Request #12036 · jiminny/app
LLM pricing overview with the most actual prices - Google Search
LLM pricing overview with the most actual prices - Google Search
Planhat
Planhat
Content Explorer
Content Explorer
Close tab
Login
Login
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New Chat
Open menu for conversation actions.
Conversation with Gemini
Conversation with Gemini
Copy prompt
Edit
You said I am on https://app-eu3.planhat.com/ how to get to ws.planhat.com
You said
I am on https://app-eu3.planhat.com/ how to get to ws.planhat.com
Listen
Gemini said
Gemini said
To get to
ws.planhat.com
(which is the address for the "Upgraded Planhat" or "Next Generation" interface) while you are currently on the EU regional server (
app-eu3.planhat.com
), you have two primary options:
1. The Manual URL Change
1. The Manual URL Change
Because Planhat uses specific subdomains for different versions and regions, you can try navigating directly. However, note that
ws.planhat.com
is a global entry point for the upgraded platform.
Try navigating to:
https://ws.planhat.com
https://ws.planhat.com
If your account has been migrated to the upgraded version, it should recognize your session or prompt you to log in.
Note:
If your data is specifically hosted on the
eu3
cluster, the system may automatically redirect you to a regional version of the upgraded UI (e.g.,
ws-eu3.planhat.com
).
2. The In-App "Switch" (If Available)
2. The In-App "Switch" (If Available)
If your tenant is eligible for the upgrade but you are still in the classic "app" view, look for these UI elements:
The Top Gray Bar:
Click on your
Tenant Name/Logo
in the top-left corner. This often opens the "Global Tools" menu.
Upgrade Prompts:
In some instances, Planhat places a "Try the new Planhat" or "Upgraded Planhat" toggle in the Help menu (the
"?" icon
in the top right) or as a banner at the top of the screen.
Why use ws.planhat.com?
Why use ws.planhat.com?
You likely need this URL to access newer "Global Tools" and features that are only available in the upgraded version, such as:
Data Model Manager:
For advanced field and object configuration.
Portal Manager:
To manage customer-facing portals....
|
22781
|
NULL
|
NULL
|
NULL
|
|
9845
|
443
|
23
|
2026-05-08T13:37:39.929725+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-08/1778 /Users/lukas/.screenpipe/data/data/2026-05-08/1778247459929_m1.jpg...
|
PhpStorm
|
faVsco.js – HubspotSyncStrategyBase.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {
"headers":{
"Date":["Thu,07 May 2026 14:21:15 GMT"],
"Content-Type":["application/json;charset=utf-8"],
"Transfer-Encoding":["chunked"],
"Connection":["keep-alive"],
"CF-Ray":["9f80deb8db60dc3a-SOF"],
"CF-Cache-Status":["DYNAMIC"],
"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],
"Vary":["origin,
accept-encoding"],
"access-control-allow-credentials":["false"],
"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",
cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],
"x-content-type-options":["nosniff"],
"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],
"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,
07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],
"Report-To":["{
\"endpoints\":[{
\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],
\"group\":\"cf-nel\",
\"max_age\":604800}"],
"NEL":["{
\"success_fraction\":0.01,
\"report_to\":\"cf-nel\",
\"max_age\":604800}"],
"Server":["cloudflare"]}} {
"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab",
"trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Code changed:
Hide
Sync Changes
Hide This Notification
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot\OpportunitySyncStrategy;
use Jiminny\Exceptions\Crm\InvalidSyncParametersException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Services\Crm\CrmConfigurationSettingsService;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\ClosedDealStagesService;
use Jiminny\Services\Crm\Hubspot\DealFieldsService;
use Jiminny\Services\Crm\Hubspot\PayloadBuilder;
use Jiminny\Services\Crm\OpportunitySyncStrategyInterface;
use Psr\Log\LoggerInterface;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
abstract class HubspotSyncStrategyBase implements OpportunitySyncStrategyInterface
{
protected Client $client;
protected PayloadBuilder $payloadBuilder;
public function __construct(Client $client)
{
$this->client = $client;
$this->payloadBuilder = app(PayloadBuilder::class);
}
/**
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
* @throws HubspotException
*/
public function fetchOpportunities(
array $params,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
try {
$this->validateParameters($params);
} catch (InvalidSyncParametersException $e) {
$logger = app(LoggerInterface::class);
$logger->error('Invalid sync parameters: ' . $e->getMessage());
// Return empty generator for invalid parameters
return;
}
$fields = $this->getOpportunityFields($params['config']);
$payload = $this->buildQuery($params, $fields);
$offset = $params['offset'] ?? 0;
yield from $this->client->getPaginatedDataGenerator(
$payload,
'deals',
$offset,
$total,
$lastRecordId
);
}
protected function getOpportunityFields(Configuration $config): array
{
return $this->getDealFieldsService()->getFieldsForConfiguration($config);
}
protected function buildQuery(array $params, array $fields): array
{
return [];
}
protected function getDealFieldsService(): DealFieldsService
{
return app(DealFieldsService::class);
}
protected function getCrmConfigurationSettingsService(): CrmConfigurationSettingsService
{
return app(CrmConfigurationSettingsService::class);
}
protected function getClosedDealStagesService(): ClosedDealStagesService
{
return app(ClosedDealStagesService::class);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide
app ~/jiminny/app, folder
.circleci, folder
.cursor, folder
.github
.sonarlint, folder
.vscode, folder
.windsurf, folder
app, sources root
Actions, folder
Component, folder
Acl, folder
ActionItems, folder
Activity, folder
ActivityAnalytics, folder
ActivitySearch, folder
AiActivityType, folder
AiAutomation, folder
AiCallScoring, folder
AskAnything, folder
Dtos, folder
Events, folder
AskAnythingPromptService.php, class
HistoryService.php, class
AskJiminnyAi, folder
AWS, folder
BillingManagement, folder
Cache, folder
CoachingFeedback, folder
Country, folder
CustomerApi, folder
Database, folder
Datadog, folder
DateTime, folder
DealInsights, folder
DealRisks, folder
ElasticSearch, folder
Eloquent, folder
Encoding, folder
Encryption, folder
ES, folder
Faker, folder
FeatureFlags, folder
FFMpeg, folder
FileSystem, folder
Gecko, folder
Gong, folder
GuzzleHttp, folder
KeyPoints, folder
Kiosk, folder
LanguageDetection, folder
LiveFeed, folder
Locks, folder
Math, folder
MediaPipeline, folder
MeetingBot, folder
MobileSettings, folder
Model, folder
Notification, folder
Nudge, folder
ParagraphBreaker, folder
ParticipantSpeech, folder
PartitionedCookie, folder
PlaybackPage, folder
Playlist, folder
Prophet, folder
ProphetAi, folder
ProsperWorks, folder
Queue, folder
Router, folder
Saml2, folder
SCIM, folder
Seeder, folder
Sentry, folder
Serializer, folder
Settings, folder
Sidekick, folder
Slack, folder
TeamInsights, folder
TimeMemoryMapper, folder
Transcription, folder
TranscriptionSummary, folder
Twilio, folder
Uploader, folder
UrlGenerator, folder
Utility, folder
Exceptions, folder
Service, folder
BaseRateLimiter.php, class
EfficientJsonParser.php, class
ProviderRateLimiter.php, class
RateLimiterInstance.php, class
Uuid
Waveform
Webhooks
Workflow
Configuration
Console
Commands
Activities
Analytics
Calendars
Crm...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot\\OpportunitySyncStrategy;\n\nuse Jiminny\\Exceptions\\Crm\\InvalidSyncParametersException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Services\\Crm\\CrmConfigurationSettingsService;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\ClosedDealStagesService;\nuse Jiminny\\Services\\Crm\\Hubspot\\DealFieldsService;\nuse Jiminny\\Services\\Crm\\Hubspot\\PayloadBuilder;\nuse Jiminny\\Services\\Crm\\OpportunitySyncStrategyInterface;\nuse Psr\\Log\\LoggerInterface;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\n\nabstract class HubspotSyncStrategyBase implements OpportunitySyncStrategyInterface\n{\n protected Client $client;\n protected PayloadBuilder $payloadBuilder;\n\n public function __construct(Client $client)\n {\n $this->client = $client;\n $this->payloadBuilder = app(PayloadBuilder::class);\n }\n\n /**\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n * @throws HubspotException\n */\n public function fetchOpportunities(\n array $params,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n try {\n $this->validateParameters($params);\n } catch (InvalidSyncParametersException $e) {\n $logger = app(LoggerInterface::class);\n $logger->error('Invalid sync parameters: ' . $e->getMessage());\n\n // Return empty generator for invalid parameters\n return;\n }\n\n $fields = $this->getOpportunityFields($params['config']);\n $payload = $this->buildQuery($params, $fields);\n $offset = $params['offset'] ?? 0;\n\n yield from $this->client->getPaginatedDataGenerator(\n $payload,\n 'deals',\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n protected function getOpportunityFields(Configuration $config): array\n {\n return $this->getDealFieldsService()->getFieldsForConfiguration($config);\n }\n\n protected function buildQuery(array $params, array $fields): array\n {\n return [];\n }\n\n protected function getDealFieldsService(): DealFieldsService\n {\n return app(DealFieldsService::class);\n }\n\n protected function getCrmConfigurationSettingsService(): CrmConfigurationSettingsService\n {\n return app(CrmConfigurationSettingsService::class);\n }\n\n protected function getClosedDealStagesService(): ClosedDealStagesService\n {\n return app(ClosedDealStagesService::class);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot\\OpportunitySyncStrategy;\n\nuse Jiminny\\Exceptions\\Crm\\InvalidSyncParametersException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Services\\Crm\\CrmConfigurationSettingsService;\nuse Jiminny\\Services\\Crm\\Hubspot\\Client;\nuse Jiminny\\Services\\Crm\\Hubspot\\ClosedDealStagesService;\nuse Jiminny\\Services\\Crm\\Hubspot\\DealFieldsService;\nuse Jiminny\\Services\\Crm\\Hubspot\\PayloadBuilder;\nuse Jiminny\\Services\\Crm\\OpportunitySyncStrategyInterface;\nuse Psr\\Log\\LoggerInterface;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\n\nabstract class HubspotSyncStrategyBase implements OpportunitySyncStrategyInterface\n{\n protected Client $client;\n protected PayloadBuilder $payloadBuilder;\n\n public function __construct(Client $client)\n {\n $this->client = $client;\n $this->payloadBuilder = app(PayloadBuilder::class);\n }\n\n /**\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n * @throws HubspotException\n */\n public function fetchOpportunities(\n array $params,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n try {\n $this->validateParameters($params);\n } catch (InvalidSyncParametersException $e) {\n $logger = app(LoggerInterface::class);\n $logger->error('Invalid sync parameters: ' . $e->getMessage());\n\n // Return empty generator for invalid parameters\n return;\n }\n\n $fields = $this->getOpportunityFields($params['config']);\n $payload = $this->buildQuery($params, $fields);\n $offset = $params['offset'] ?? 0;\n\n yield from $this->client->getPaginatedDataGenerator(\n $payload,\n 'deals',\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n protected function getOpportunityFields(Configuration $config): array\n {\n return $this->getDealFieldsService()->getFieldsForConfiguration($config);\n }\n\n protected function buildQuery(array $params, array $fields): array\n {\n return [];\n }\n\n protected function getDealFieldsService(): DealFieldsService\n {\n return app(DealFieldsService::class);\n }\n\n protected function getCrmConfigurationSettingsService(): CrmConfigurationSettingsService\n {\n return app(CrmConfigurationSettingsService::class);\n }\n\n protected function getClosedDealStagesService(): ClosedDealStagesService\n {\n return app(ClosedDealStagesService::class);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app ~/jiminny/app, folder","depth":6,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".circleci, folder","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".cursor, folder","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".github","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".sonarlint, folder","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".vscode, folder","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".windsurf, folder","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"app, sources root","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Actions, folder","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Component, folder","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Acl, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActionItems, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Activity, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityAnalytics, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivitySearch, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AiActivityType, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AiAutomation, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AiCallScoring, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AskAnything, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Dtos, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Events, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AskAnythingPromptService.php, class","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"HistoryService.php, class","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AskJiminnyAi, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AWS, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"BillingManagement, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Cache, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedback, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Country, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CustomerApi, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Database, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Datadog, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DateTime, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DealInsights, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DealRisks, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ElasticSearch, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Eloquent, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Encoding, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Encryption, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ES, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Faker, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FeatureFlags, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FFMpeg, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FileSystem, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Gecko, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Gong, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"GuzzleHttp, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"KeyPoints, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Kiosk, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"LanguageDetection, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"LiveFeed, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Locks, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Math, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MediaPipeline, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MeetingBot, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MobileSettings, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Model, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Notification, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Nudge, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ParagraphBreaker, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ParticipantSpeech, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PartitionedCookie, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackPage, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Playlist, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Prophet, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ProphetAi, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ProsperWorks, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Queue, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Router, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Saml2, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SCIM, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Seeder, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Sentry, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Serializer, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Settings, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Sidekick, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Slack, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"TeamInsights, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"TimeMemoryMapper, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Transcription, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"TranscriptionSummary, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Twilio, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Uploader, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"UrlGenerator, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Utility, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Exceptions, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Service, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"BaseRateLimiter.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"EfficientJsonParser.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ProviderRateLimiter.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"RateLimiterInstance.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Uuid","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Waveform","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Webhooks","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Workflow","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Configuration","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Console","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Commands","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Activities","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Analytics","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Calendars","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Crm","depth":10,"on_screen":false,"role_description":"text"}]...
|
-7993828380324121508
|
-3610448465692067380
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {
"headers":{
"Date":["Thu,07 May 2026 14:21:15 GMT"],
"Content-Type":["application/json;charset=utf-8"],
"Transfer-Encoding":["chunked"],
"Connection":["keep-alive"],
"CF-Ray":["9f80deb8db60dc3a-SOF"],
"CF-Cache-Status":["DYNAMIC"],
"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],
"Vary":["origin,
accept-encoding"],
"access-control-allow-credentials":["false"],
"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",
cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],
"x-content-type-options":["nosniff"],
"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],
"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,
07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],
"Report-To":["{
\"endpoints\":[{
\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],
\"group\":\"cf-nel\",
\"max_age\":604800}"],
"NEL":["{
\"success_fraction\":0.01,
\"report_to\":\"cf-nel\",
\"max_age\":604800}"],
"Server":["cloudflare"]}} {
"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab",
"trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Code changed:
Hide
Sync Changes
Hide This Notification
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot\OpportunitySyncStrategy;
use Jiminny\Exceptions\Crm\InvalidSyncParametersException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Services\Crm\CrmConfigurationSettingsService;
use Jiminny\Services\Crm\Hubspot\Client;
use Jiminny\Services\Crm\Hubspot\ClosedDealStagesService;
use Jiminny\Services\Crm\Hubspot\DealFieldsService;
use Jiminny\Services\Crm\Hubspot\PayloadBuilder;
use Jiminny\Services\Crm\OpportunitySyncStrategyInterface;
use Psr\Log\LoggerInterface;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
abstract class HubspotSyncStrategyBase implements OpportunitySyncStrategyInterface
{
protected Client $client;
protected PayloadBuilder $payloadBuilder;
public function __construct(Client $client)
{
$this->client = $client;
$this->payloadBuilder = app(PayloadBuilder::class);
}
/**
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
* @throws HubspotException
*/
public function fetchOpportunities(
array $params,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
try {
$this->validateParameters($params);
} catch (InvalidSyncParametersException $e) {
$logger = app(LoggerInterface::class);
$logger->error('Invalid sync parameters: ' . $e->getMessage());
// Return empty generator for invalid parameters
return;
}
$fields = $this->getOpportunityFields($params['config']);
$payload = $this->buildQuery($params, $fields);
$offset = $params['offset'] ?? 0;
yield from $this->client->getPaginatedDataGenerator(
$payload,
'deals',
$offset,
$total,
$lastRecordId
);
}
protected function getOpportunityFields(Configuration $config): array
{
return $this->getDealFieldsService()->getFieldsForConfiguration($config);
}
protected function buildQuery(array $params, array $fields): array
{
return [];
}
protected function getDealFieldsService(): DealFieldsService
{
return app(DealFieldsService::class);
}
protected function getCrmConfigurationSettingsService(): CrmConfigurationSettingsService
{
return app(CrmConfigurationSettingsService::class);
}
protected function getClosedDealStagesService(): ClosedDealStagesService
{
return app(ClosedDealStagesService::class);
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide
app ~/jiminny/app, folder
.circleci, folder
.cursor, folder
.github
.sonarlint, folder
.vscode, folder
.windsurf, folder
app, sources root
Actions, folder
Component, folder
Acl, folder
ActionItems, folder
Activity, folder
ActivityAnalytics, folder
ActivitySearch, folder
AiActivityType, folder
AiAutomation, folder
AiCallScoring, folder
AskAnything, folder
Dtos, folder
Events, folder
AskAnythingPromptService.php, class
HistoryService.php, class
AskJiminnyAi, folder
AWS, folder
BillingManagement, folder
Cache, folder
CoachingFeedback, folder
Country, folder
CustomerApi, folder
Database, folder
Datadog, folder
DateTime, folder
DealInsights, folder
DealRisks, folder
ElasticSearch, folder
Eloquent, folder
Encoding, folder
Encryption, folder
ES, folder
Faker, folder
FeatureFlags, folder
FFMpeg, folder
FileSystem, folder
Gecko, folder
Gong, folder
GuzzleHttp, folder
KeyPoints, folder
Kiosk, folder
LanguageDetection, folder
LiveFeed, folder
Locks, folder
Math, folder
MediaPipeline, folder
MeetingBot, folder
MobileSettings, folder
Model, folder
Notification, folder
Nudge, folder
ParagraphBreaker, folder
ParticipantSpeech, folder
PartitionedCookie, folder
PlaybackPage, folder
Playlist, folder
Prophet, folder
ProphetAi, folder
ProsperWorks, folder
Queue, folder
Router, folder
Saml2, folder
SCIM, folder
Seeder, folder
Sentry, folder
Serializer, folder
Settings, folder
Sidekick, folder
Slack, folder
TeamInsights, folder
TimeMemoryMapper, folder
Transcription, folder
TranscriptionSummary, folder
Twilio, folder
Uploader, folder
UrlGenerator, folder
Utility, folder
Exceptions, folder
Service, folder
BaseRateLimiter.php, class
EfficientJsonParser.php, class
ProviderRateLimiter.php, class
RateLimiterInstance.php, class
Uuid
Waveform
Webhooks
Workflow
Configuration
Console
Commands
Activities
Analytics
Calendars
Crm...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
16709
|
746
|
24
|
2026-05-11T09:18:32.605702+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778491112605_m1.jpg...
|
CleanShot X
|
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
1:01
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"1:01","depth":1,"bounds":{"left":0.72256947,"top":0.96055555,"width":0.023611112,"height":0.015555556},"on_screen":true,"role_description":"text"}]...
|
-7992183145974185969
|
-7992183145974185969
|
visual_change
|
hybrid
|
NULL
|
1:01
SlackFileEditViewGoHistoryWindowHelpI46l§ Sup 1:01
SlackFileEditViewGoHistoryWindowHelpI46l§ Support Daily • in 2h 42 m6д Huddle with Petko KashinskiPetko KashinskiScreen shareChromeFileEditViewHistoryBookmarksProfilesTabWindowHelpQWorkGreelScoreandrewilso®Call ABJiminM Inbox=Nate=AppsBuildu UsersNewrun.userpilot.io/integrations/webhooksAIKBChatPlayground Al...10 Jiminny - Calenda..M GMail• My Calendly - Eve...= PH New UI LoginGet Starting with J...Apps• Chloe Onboarding....+ cx Journey SMB....Q Search engagement, feedback, reports, users and more100% <8• Mon 11 May 12:18:32+8•Mon 11 May 12:18u LXRl WorkJimininyCreate WebhookDashboardsPeopleDacaWoridiowsIntegrationsWith integrations, you can stream Userpilot-generated events to other external providers.Native IntegrationsWebhookswotes roure usns ora chadied viconooks. Upyrade your pion to acuvote more de d ume.UpgradeNamePlanha WH TestPlanhat WH TessEndpointDescriptionhttps://webhooks.planhat.com/catch/9d4dd6a4-7544-4663-873b-5a120f399_Description Not Availablehttps://webhooks.planhat.com/catch/9d4dd6a4-7544-4663-873b-5a120f399.Description Not Available |Huddle with Lukas Kovalik$= Al Notes: OffStatusPK&Get Started with Userpilot200m())))ГА1:01Leave...
|
NULL
|
NULL
|
NULL
|
NULL
|