// 2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)

взяти визначення мавка/бібліотека;
взяти визначення мавка/пристрій;
простір мавка {
  простір бібліотека {
    внутрішня дія здійснити_предмет(М: *Машина, предмет: *Предмет, кількість_задіяних: п32, дані_задіяних: *Значення) {
      змінна інформація_падіння: ІнформаціяПадіння;

      здійснити(
        М,
        НЕДІЙСНЕ,
        ПРЕДМЕТ(предмет),
        Задіяні { ВидЗадіяних2, кількість_задіяних, дані_задіяних, 0 },
        МІСЦЕю8(М, ю8"вм://бібліотека/інет/підключитись.ц", 0),
      );

      якщо отримати_інформацію_падіння(М, інформація_падіння::адреса) {
        якщо М.налаштування.обробник_падінь == пусто {
          ЗАПАНІКУВАТИ(М, "необроблене падіння!");
        } інакше {
          вимкнути_стан_падіння(М);

          М.налаштування.обробник_падінь(
            М,
            інформація_падіння
          );
        }
      }
    }

    внутрішня дія обробник_підключення(адр_звʼязок: адреса, помилка: природне) {
      якщо адр_звʼязок == пусто {
        // потім: паніка
        вернути;
      }

      змінна ап = бібліотека_мавки_інет_отримати_аргумент_звʼязку(адр_звʼязок) як *АргументІнетЗвʼязку;
      змінна М = ап.М;
      змінна предмет_звʼязку = створити_інет_Звʼязок(М, адр_звʼязок);
      ап.прт_звʼязок = притримати_глобально(М, предмет_звʼязку як *Предмет);

      змінна предмет_обробник_підключення: *Предмет = пусто;

      якщо ап.прт_обробник_підключення != пусто {
        предмет_обробник_підключення = ап.прт_обробник_підключення.предмет;
      }

      якщо предмет_обробник_підключення == пусто {
        вернути;
      }

      змінна предмет_помилки: *Предмет = пусто;

      якщо помилка != 0 {
        предмет_помилки = створити_помилку(
          М,
          отримати_текст_інет_помилки(М, помилка),
        );
        змінити_властивість(
          М,
          ПРЕДМЕТ(предмет_помилки),
          М.константи_назв._код,
          ЧИСЛО(р64(помилка)),
          МІСЦЕю8(М, ю8"вм://бібліотека/інет/підключитись.ц", 0),
        );
      }

      змінна кількість_задіяних = п32(2);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      дані_задіяних[0] = ПРЕДМЕТ(предмет_звʼязку);
      якщо предмет_помилки == пусто {
        дані_задіяних[1] = НЕДІЙСНЕ;
      } інакше {
        дані_задіяних[1] = ПРЕДМЕТ(предмет_помилки);
      }

      здійснити_предмет(
        М,
        предмет_обробник_підключення,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія обробник_даних(адр_звʼязок: адреса, дані: *п8, розмір: природне) {
      змінна ап = бібліотека_мавки_інет_отримати_аргумент_звʼязку(адр_звʼязок) як *АргументІнетЗвʼязку;
      змінна М = ап.М;
      змінна предмет_звʼязку = ап.прт_звʼязок.предмет;
      змінна предмет_обробник_даних: *Предмет = пусто;

      якщо ап.прт_обробник_даних != пусто {
        предмет_обробник_даних = ап.прт_обробник_даних.предмет;
      }

      якщо предмет_обробник_даних == пусто {
        звільнити(М, дані);
        вернути;
      }

      змінна кількість_задіяних = п32(2);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      дані_задіяних[0] = ПРЕДМЕТ(предмет_звʼязку);
      якщо ап.як_текст {
        дані_задіяних[1] = ПРЕДМЕТ(створити_текст_без_копіювання(
          М,
          розмір,
          дані,
        ));
      } інакше {
        дані_задіяних[1] = ПРЕДМЕТ(створити_дані_без_копіювання(
          М,
          розмір,
          дані,
        ));
      }

      здійснити_предмет(
        М,
        предмет_обробник_даних,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія обробник_стікання(адр_звʼязок: адреса) {
      змінна ап = бібліотека_мавки_інет_отримати_аргумент_звʼязку(адр_звʼязок) як *АргументІнетЗвʼязку;
      змінна М = ап.М;
      змінна предмет_звʼязку = ап.прт_звʼязок.предмет;
      змінна предмет_обробник_стікання: *Предмет = пусто;

      якщо ап.прт_обробник_стікання != пусто {
        предмет_обробник_стікання = ап.прт_обробник_стікання.предмет;
      }

      якщо предмет_обробник_стікання == пусто {
        вернути;
      }

      змінна кількість_задіяних = п32(1);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      дані_задіяних[0] = ПРЕДМЕТ(предмет_звʼязку);

      здійснити_предмет(
        М,
        предмет_обробник_стікання,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія обробник_закінчення(адр_звʼязок: адреса) {
      змінна ап = бібліотека_мавки_інет_отримати_аргумент_звʼязку(адр_звʼязок) як *АргументІнетЗвʼязку;
      змінна М = ап.М;
      змінна предмет_звʼязку = ап.прт_звʼязок.предмет;
      змінна предмет_обробник_закінчення: *Предмет = пусто;

      якщо ап.прт_обробник_закінчення != пусто {
        предмет_обробник_закінчення = ап.прт_обробник_закінчення.предмет;
      }

      якщо предмет_обробник_закінчення == пусто {
        вернути;
      }

      змінна кількість_задіяних = п32(1);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      дані_задіяних[0] = ПРЕДМЕТ(предмет_звʼязку);

      здійснити_предмет(
        М,
        предмет_обробник_закінчення,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія обробник_помилки(адр_звʼязок: адреса, помилка: природне) {
      змінна ап = бібліотека_мавки_інет_отримати_аргумент_звʼязку(адр_звʼязок) як *АргументІнетЗвʼязку;
      змінна М = ап.М;
      змінна предмет_звʼязку = ап.прт_звʼязок.предмет;
      змінна предмет_обробник_помилки: *Предмет = пусто;

      якщо ап.прт_обробник_помилки != пусто {
        предмет_обробник_помилки = ап.прт_обробник_помилки.предмет;
      }

      якщо предмет_обробник_помилки == пусто {
        вернути;
      }

      змінна кількість_задіяних = п32(2);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      змінна предмет_помилки = створити_помилку(
        М,
        отримати_текст_інет_помилки(М, помилка),
      );
      змінити_властивість(
        М,
        ПРЕДМЕТ(предмет_помилки),
        М.константи_назв._код,
        ЧИСЛО(р64(помилка)),
        МІСЦЕю8(М, ю8"вм://бібліотека/інет/підключитись.ц", 0),
      );

      дані_задіяних[0] = ПРЕДМЕТ(предмет_звʼязку);
      дані_задіяних[1] = ПРЕДМЕТ(предмет_помилки);

      здійснити_предмет(
        М,
        предмет_обробник_помилки,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія обробник_відключення(адр_звʼязок: адреса) {
      змінна ап = бібліотека_мавки_інет_отримати_аргумент_звʼязку(адр_звʼязок) як *АргументІнетЗвʼязку;
      змінна М = ап.М;
      змінна предмет_звʼязку = ап.прт_звʼязок.предмет;
      змінна предмет_обробник_відключення: *Предмет = пусто;

      якщо ап.прт_обробник_відключення != пусто {
        предмет_обробник_відключення = ап.прт_обробник_відключення.предмет;
      }

      якщо предмет_обробник_відключення == пусто {
        вернути;
      }

      змінна кількість_задіяних = п32(2);
      змінна дані_задіяних = виділити<Значення>(М, природне(кількість_задіяних));

      дані_задіяних[0] = ПРЕДМЕТ(предмет_звʼязку);

      здійснити_предмет(
        М,
        предмет_обробник_відключення,
        кількість_задіяних,
        дані_задіяних,
      );
    }

    внутрішня дія рідна_дія__підключитись(
      М: *Машина,
      діяльність: *Діяльність
    ) -> ЗначенняАбоСтанПадіння {
      змінна задіяне_іа = НЕДІЙСНЕ;
      змінна знайдено_задіяне_іа = ні;
      змінна задіяне_порт = НЕДІЙСНЕ;
      змінна знайдено_задіяне_порт = ні;
      змінна задіяне_формат = НЕДІЙСНЕ;
      змінна знайдено_задіяне_формат = ні;
      змінна задіяне_обробник_підключення = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_підключення = ні;
      змінна задіяне_обробник_даних = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_даних = ні;
      змінна задіяне_обробник_стікання = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_стікання = ні;
      змінна задіяне_обробник_закінчення = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_закінчення = ні;
      змінна задіяне_обробник_помилки = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_помилки = ні;
      змінна задіяне_обробник_відключення = НЕДІЙСНЕ;
      змінна знайдено_задіяне_обробник_відключення = ні;

      знайдено_задіяне_іа = знайти_задіяне(М, діяльність.задіяні, 0, М.константи_назв._іа, задіяне_іа::адреса);
      знайдено_задіяне_порт = знайти_задіяне(М, діяльність.задіяні, 1, М.константи_назв._порт, задіяне_порт::адреса);
      знайдено_задіяне_формат = знайти_задіяне(М, діяльність.задіяні, 2, М.константи_назв._формат, задіяне_формат::адреса);
      знайдено_задіяне_обробник_підключення = знайти_задіяне(М, діяльність.задіяні, 3, М.константи_назв._обробник_підключення, задіяне_обробник_підключення::адреса);
      знайдено_задіяне_обробник_даних = знайти_задіяне(М, діяльність.задіяні, 4, М.константи_назв._обробник_даних, задіяне_обробник_даних::адреса);
      знайдено_задіяне_обробник_стікання = знайти_задіяне(М, діяльність.задіяні, 5, М.константи_назв._обробник_стікання, задіяне_обробник_стікання::адреса);
      знайдено_задіяне_обробник_закінчення = знайти_задіяне(М, діяльність.задіяні, 6, М.константи_назв._обробник_закінчення, задіяне_обробник_закінчення::адреса);
      знайдено_задіяне_обробник_помилки = знайти_задіяне(М, діяльність.задіяні, 7, М.константи_назв._обробник_помилки, задіяне_обробник_помилки::адреса);
      знайдено_задіяне_обробник_відключення = знайти_задіяне(М, діяльність.задіяні, 8, М.константи_назв._обробник_відключення, задіяне_обробник_відключення::адреса);

      змінна іа_вид: природне;
      змінна іа_дані: *п8;
      змінна іа_розмір: природне;
      змінна треба_звільнити_іа_дані = ні;
      змінна порт: природне;
      змінна як_текст = ні;
      змінна предмет_обробник_підключення: *Предмет;
      змінна предмет_обробник_даних: *Предмет;
      змінна предмет_обробник_стікання: *Предмет;
      змінна предмет_обробник_закінчення: *Предмет;
      змінна предмет_обробник_помилки: *Предмет;
      змінна предмет_обробник_відключення: *Предмет;

      якщо не знайдено_задіяне_іа {
        змінна нульова_іа = ю8"0.0.0.0";
        іа_вид = БІБЛІОТЕКА_МАВКИ_ВИД_ІА_ІП4;
        іа_дані = нульова_іа.дані;
        іа_розмір = нульова_іа.розмір;
        треба_звільнити_іа_дані = ні;
      } інакше якщо задіяне_іа.вид == ЗПредмет {
        змінна предмет_іа = задіяне_іа.дані як *Предмет;

        якщо предмет_іа.клас == М.клас_Дані {
          змінна предмет_даних = предмет_іа як *ПредметДаних;

          іа_вид = БІБЛІОТЕКА_МАВКИ_ВИД_ІА_ІП6;
          іа_дані = предмет_даних.дані;
          іа_розмір = предмет_даних.розмір;
          треба_звільнити_іа_дані = ні;
        } інакше якщо предмет_іа.клас == М.клас_Текст {
          змінна предмет_тексту = предмет_іа як *ПредметТексту;
          змінна іа_ю8: ю8;
          змінна позиція_помилки: природне;

          змінна успіх = перекодувати_кд_в_ю8(
            М,
            предмет_тексту.значення,
            іа_ю8::адреса,
            позиція_помилки::адреса
          );
          якщо не успіх {
            вернути ПАДІННЯ(М, створити_текст(М, "Не вдалось перекодувати іа в ю8."));
          }

          іа_вид = БІБЛІОТЕКА_МАВКИ_ВИД_ІА_ІП4;
          іа_дані = іа_ю8.дані;
          іа_розмір = іа_ю8.розмір;
          треба_звільнити_іа_дані = так;
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"іа\" має бути текстом або даними."));
      }

      якщо не знайдено_задіяне_порт {
        порт = 0;
      } інакше якщо задіяне_порт.вид == ЗЧисло {
        порт = природне(задіяне_порт.дані як р64);
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"порт\" має бути числом."));
      }

      якщо знайдено_задіяне_формат {
        якщо задіяне_формат.вид == ЗПредмет {
          змінна пф = задіяне_формат.дані як *Предмет;
          якщо пф == М.клас_Дані {
          } інакше якщо пф == М.клас_Текст {
            як_текст = так;
          } інакше {
            вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"формат\" має бути класом Дані або Текст!"));
          }
        } інакше {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"формат\" має бути класом Дані або Текст!"));
        }
      }

      якщо не знайдено_задіяне_порт {
        порт = 0;
      } інакше якщо задіяне_порт.вид == ЗЧисло {
        порт = природне(задіяне_порт.дані як р64);
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"порт\" має бути числом."));
      }

      якщо не знайдено_задіяне_обробник_підключення {
        предмет_обробник_підключення = пусто;
      } інакше якщо задіяне_обробник_підключення.вид == ЗПредмет {
        предмет_обробник_підключення = задіяне_обробник_підключення.дані як *Предмет;

        якщо предмет_обробник_підключення.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_підключення\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_підключення\" має бути дією!"));
      }

      якщо не знайдено_задіяне_обробник_даних {
        предмет_обробник_даних = пусто;
      } інакше якщо задіяне_обробник_даних.вид == ЗПредмет {
        предмет_обробник_даних = задіяне_обробник_даних.дані як *Предмет;

        якщо предмет_обробник_даних.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_даних\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_даних\" має бути дією!"));
      }

      якщо не знайдено_задіяне_обробник_стікання {
        предмет_обробник_стікання = пусто;
      } інакше якщо задіяне_обробник_стікання.вид == ЗПредмет {
        предмет_обробник_стікання = задіяне_обробник_стікання.дані як *Предмет;

        якщо предмет_обробник_стікання.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_стікання\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_стікання\" має бути дією!"));
      }

      якщо не знайдено_задіяне_обробник_закінчення {
        предмет_обробник_закінчення = пусто;
      } інакше якщо задіяне_обробник_закінчення.вид == ЗПредмет {
        предмет_обробник_закінчення = задіяне_обробник_закінчення.дані як *Предмет;

        якщо предмет_обробник_закінчення.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_закінчення\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_закінчення\" має бути дією!"));
      }

      якщо не знайдено_задіяне_обробник_помилки {
        предмет_обробник_помилки = пусто;
      } інакше якщо задіяне_обробник_помилки.вид == ЗПредмет {
        предмет_обробник_помилки = задіяне_обробник_помилки.дані як *Предмет;

        якщо предмет_обробник_помилки.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_помилки\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_помилки\" має бути дією!"));
      }

      якщо не знайдено_задіяне_обробник_відключення {
        предмет_обробник_відключення = пусто;
      } інакше якщо задіяне_обробник_відключення.вид == ЗПредмет {
        предмет_обробник_відключення = задіяне_обробник_відключення.дані як *Предмет;

        якщо предмет_обробник_відключення.клас != М.клас_Дія {
          вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_відключення\" має бути дією!"));
        }
      } інакше {
        вернути ПАДІННЯ(М, створити_текст(М, "Задіяне \"обробник_відключення\" має бути дією!"));
      }

      змінна ап = виділити_аргумент_інет_звʼязку(М);
      ап.М = М;
      ап.як_текст = як_текст;
      якщо предмет_обробник_підключення != пусто {
        ап.прт_обробник_підключення = притримати_глобально(М, предмет_обробник_підключення);
      }
      якщо предмет_обробник_даних != пусто {
        ап.прт_обробник_даних = притримати_глобально(М, предмет_обробник_даних);
      }
      якщо предмет_обробник_стікання != пусто {
        ап.прт_обробник_стікання = притримати_глобально(М, предмет_обробник_стікання);
      }
      якщо предмет_обробник_закінчення != пусто {
        ап.прт_обробник_закінчення = притримати_глобально(М, предмет_обробник_закінчення);
      }
      якщо предмет_обробник_помилки != пусто {
        ап.прт_обробник_помилки = притримати_глобально(М, предмет_обробник_помилки);
      }
      якщо предмет_обробник_відключення != пусто {
        ап.прт_обробник_відключення = притримати_глобально(М, предмет_обробник_відключення);
      }

      бібліотека_мавки_інет_підключитись(
        іа_вид,
        іа_дані,
        іа_розмір,
        порт,
        обробник_підключення,
        обробник_даних,
        обробник_стікання,
        обробник_закінчення,
        обробник_помилки,
        обробник_відключення,
        ап,
        обробник_знищення_інет_звʼязку,
      );

      якщо треба_звільнити_іа_дані {
        звільнити(М, іа_дані);
      }

      вернути НЕДІЙСНЕ;
    }

    дія записати_дію__інет__підключитись(
      М: *Машина,
      предмет_модуля: *ПредметМодуля
    ) {
      змінна кількість_параметрів = природне(9);
      змінна дані_параметрів = виділити<Значення>(М, кількість_параметрів);

      дані_параметрів[0] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._іа,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[1] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._порт,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[2] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._формат,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[3] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_підключення,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[4] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_даних,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[5] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_стікання,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[6] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_закінчення,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[7] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_помилки,
        пусто,
        НЕДІЙСНЕ
      ));
      дані_параметрів[8] = ПРЕДМЕТ(створити_параметр(
        М,
        М.константи_назв._обробник_відключення,
        пусто,
        НЕДІЙСНЕ
      ));

      змінна д = створити_рідну_дію(
        М,
        М.константи_назв._підключитись,
        створити_послідовність_без_копіювання(
          М,
          кількість_параметрів,
          дані_параметрів
        ),
        пусто,
        рідна_дія__підключитись,
        пусто
      );

      записати_властивість_модуля(
        М,
        предмет_модуля,
        М.константи_назв._підключитись,
        ПРЕДМЕТ(д)
      );
    }
  }
}