Full Code of dOpensource/dsiprouter for AI

master 9fd2f01d679c cached
506 files
5.2 MB
1.4M tokens
1051 symbols
1 requests
Download .txt
Showing preview only (5,522K chars total). Download the full file or copy to clipboard to get everything.
Repository: dOpensource/dsiprouter
Branch: master
Commit: 9fd2f01d679c
Files: 506
Total size: 5.2 MB

Directory structure:
gitextract_y6_vpjk0/

├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.md
│   │   └── config.yml
│   └── PULL_REQUEST_TEMPLATE/
│       └── default.md
├── .gitignore
├── .readthedocs.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── CONTRIBUTORS.md
├── HA/
│   ├── consul/
│   │   ├── consul.fc
│   │   ├── consul.hcl
│   │   ├── consul.service
│   │   ├── consul.te
│   │   ├── installConsulCluster.sh
│   │   └── server.hcl
│   ├── mysql/
│   │   ├── installAAGaleraReplication.sh
│   │   └── installAAGroupReplication.sh
│   ├── pacemaker/
│   │   ├── AWS/
│   │   │   └── ocf-floatip
│   │   ├── DO/
│   │   │   ├── assign-ip
│   │   │   └── ocf-floatip
│   │   ├── installKamCluster.sh
│   │   ├── nodeutil.sh
│   │   └── scripts/
│   │       ├── stage1.sh
│   │       ├── stage2.sh
│   │       └── stage3.sh
│   └── shared_lib.sh
├── Jenkinsfile
├── Jenkinsfile.common
├── LICENSE
├── README.md
├── cloud/
│   ├── build_image.sh
│   ├── build_instance.sh
│   ├── cloud-init/
│   │   ├── configs/
│   │   │   ├── AWS.cfg
│   │   │   ├── AZURE.cfg
│   │   │   ├── DO.cfg
│   │   │   ├── GCE.cfg
│   │   │   └── VULTR.cfg
│   │   └── templates/
│   │       ├── hosts.almalinux.tmpl
│   │       ├── hosts.amzn.tmpl
│   │       ├── hosts.centos.tmpl
│   │       ├── hosts.debian.tmpl
│   │       ├── hosts.rhel.tmpl
│   │       ├── hosts.rocky.tmpl
│   │       └── hosts.ubuntu.tmpl
│   ├── find_hosts_tmpl.sh
│   └── pre-snapshot.sh
├── dnsmasq/
│   ├── almalinux/
│   │   └── install.sh
│   ├── amzn/
│   │   └── install.sh
│   ├── centos/
│   │   └── install.sh
│   ├── configs/
│   │   ├── dnsmasq_sh.conf
│   │   ├── ifupdown/
│   │   │   ├── default.conf
│   │   │   ├── networking-pre.sh
│   │   │   └── override.conf
│   │   ├── networkmanager/
│   │   │   ├── dsiprouter.conf
│   │   │   └── wait-override.conf
│   │   ├── resolv.conf
│   │   ├── resolvconf_def
│   │   ├── resolvconf_upd
│   │   ├── systemdnetworkd/
│   │   │   ├── docker.network
│   │   │   ├── dsiprouter.network
│   │   │   ├── networkd-pre.sh
│   │   │   ├── override.conf
│   │   │   └── wait-override.conf
│   │   └── systemdresolved/
│   │       └── dsiprouter.conf
│   ├── debian/
│   │   ├── 12.sh
│   │   └── install.sh
│   ├── init.d/
│   │   └── dnsmasq
│   ├── rhel/
│   │   └── install.sh
│   ├── rocky/
│   │   └── install.sh
│   ├── systemd/
│   │   ├── dnsmasq-v1.service
│   │   ├── dnsmasq-v2.service
│   │   └── dnsmasq-v3.service
│   └── ubuntu/
│       └── install.sh
├── docker/
│   ├── dsiprouter/
│   │   ├── dockerfile
│   │   └── wait-for-dsiprouter-mysql.sh
│   └── mysql/
│       └── dockerfile
├── docker-compose.yml
├── docs/
│   ├── Makefile
│   ├── requirements.in
│   ├── requirements.txt
│   └── source/
│       ├── _static/
│       │   └── placeholder
│       ├── _templates/
│       │   └── placeholder
│       ├── conf.py
│       ├── dev/
│       │   ├── database.rst
│       │   ├── dsiprouter.rst
│       │   ├── index.rst
│       │   ├── modules.rst
│       │   ├── settings.rst
│       │   ├── shared.rst
│       │   ├── sysloginit.rst
│       │   └── util.rst
│       ├── index.rst
│       ├── routes/
│       │   ├── details.rst
│       │   ├── index.rst
│       │   └── summary.rst
│       └── user/
│           ├── api.rst
│           ├── carrier_groups.rst
│           ├── command_line_options.rst
│           ├── conf.py
│           ├── configuring.rst
│           ├── debian_install.rst
│           ├── domains.rst
│           ├── global_outbound_routes.rst
│           ├── images/
│           │   └── DID_test.csv
│           ├── inbound_did_mapping.rst
│           ├── index.rst
│           ├── installing.rst
│           ├── pbxs_and_endpoints.rst
│           ├── resources.rst
│           ├── rhel_install.rst
│           ├── supported_configurations.rst
│           ├── troubleshooting.rst
│           ├── upgrade_0.50_to_0.51.rst
│           ├── upgrade_0.522_to_0.523.rst
│           ├── upgrade_0.621_to_0.63.rst
│           ├── upgrading.rst
│           └── use-cases.rst
├── dsiprouter/
│   ├── almalinux/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── amzn/
│   │   └── 2.sh
│   ├── centos/
│   │   ├── 7.sh
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── debian/
│   │   ├── 10.sh
│   │   ├── 11.sh
│   │   ├── 12.sh
│   │   └── 9.sh
│   ├── dsip-net-cfg.py
│   ├── dsip_completion.sh
│   ├── dsip_lib.sh
│   ├── pbkdf2.sh
│   ├── rhel/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── rocky/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── sudoers.d/
│   │   └── 99-dsiprouter
│   ├── systemd/
│   │   ├── dsiprouter-v1.service
│   │   └── dsiprouter-v2.service
│   └── ubuntu/
│       ├── 20.sh
│       ├── 22.sh
│       └── 24.sh
├── dsiprouter.sh
├── gui/
│   ├── database/
│   │   └── __init__.py
│   ├── dsiprouter.py
│   ├── dsiprouter_cron.py
│   ├── dsiprouter_ut.py
│   ├── modules/
│   │   ├── api/
│   │   │   ├── api.sql
│   │   │   ├── api_functions.py
│   │   │   ├── api_routes.py
│   │   │   ├── auth/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── functions.py
│   │   │   │   ├── ldap/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── interface.py
│   │   │   │   └── routes.py
│   │   │   ├── carriergroups/
│   │   │   │   ├── functions.py
│   │   │   │   ├── plugin/
│   │   │   │   │   └── twilio/
│   │   │   │   │       ├── carrier_plugintype_version.py
│   │   │   │   │       └── interface.py
│   │   │   │   └── routes.py
│   │   │   ├── cron_functions.py
│   │   │   ├── install.sh
│   │   │   ├── kamailio/
│   │   │   │   ├── errors.py
│   │   │   │   └── functions.py
│   │   │   ├── licensemanager/
│   │   │   │   ├── classes.py
│   │   │   │   ├── cli.py
│   │   │   │   ├── functions.py
│   │   │   │   └── routes.py
│   │   │   ├── mediaserver/
│   │   │   │   ├── plugin/
│   │   │   │   │   ├── fusion/
│   │   │   │   │   │   └── interface.py
│   │   │   │   │   └── fusionpbx
│   │   │   │   └── routes.py
│   │   │   └── sample_api.py
│   │   ├── cdr/
│   │   │   ├── cdrs.sql
│   │   │   ├── cron_functions.py
│   │   │   └── install.sh
│   │   ├── certificates/
│   │   │   ├── certificates.sql
│   │   │   └── install.sh
│   │   ├── custom_routing/
│   │   │   ├── custom_routing.sql
│   │   │   └── install.sh
│   │   ├── dnid_enrichment/
│   │   │   ├── dnid_enrichment.sql
│   │   │   └── install.sh
│   │   ├── domain/
│   │   │   ├── __init__.py
│   │   │   ├── domain_mapping.sql
│   │   │   ├── domain_routes.py
│   │   │   └── install.sh
│   │   ├── flowroute/
│   │   │   └── __init__.py
│   │   ├── frauddetection/
│   │   │   ├── fraud.py
│   │   │   └── install.sh
│   │   ├── fusionpbx/
│   │   │   ├── dsiprouter-provisioner.conf
│   │   │   ├── dsiprouter-provisioner.tpl
│   │   │   ├── dsiprouter.nginx
│   │   │   ├── dsiprouter.nginx.tpl
│   │   │   ├── fusionpbx_sync_functions.py
│   │   │   ├── html/
│   │   │   │   └── images/
│   │   │   │       └── placeholder.txt
│   │   │   └── install.sh
│   │   └── upgrade/
│   │       └── __init__.py
│   ├── requirements.txt
│   ├── settings.py
│   ├── shared.py
│   ├── static/
│   │   ├── css/
│   │   │   ├── bootstrap-theme.css
│   │   │   ├── bootstrap-toggle.css
│   │   │   ├── bootstrap.css
│   │   │   ├── carriergroups.css
│   │   │   ├── cdrs.css
│   │   │   ├── certificates.css
│   │   │   ├── combobox.css
│   │   │   ├── dashboard.css
│   │   │   ├── highlight/
│   │   │   │   ├── LICENSE
│   │   │   │   ├── codepen-embed.css
│   │   │   │   ├── darcula.css
│   │   │   │   ├── default.css
│   │   │   │   ├── github-gist.css
│   │   │   │   ├── github.css
│   │   │   │   ├── googlecode.css
│   │   │   │   ├── idea.css
│   │   │   │   └── monokai-sublime.css
│   │   │   ├── main.css
│   │   │   ├── msteams.css
│   │   │   └── titatoggle-dist.css
│   │   ├── fonts/
│   │   │   └── icomoon.json
│   │   ├── js/
│   │   │   ├── backupandrestore.js
│   │   │   ├── bootstrap-toggle.js
│   │   │   ├── bootstrap.js
│   │   │   ├── carriergroups.js
│   │   │   ├── cdrs.js
│   │   │   ├── certificates.js
│   │   │   ├── combobox.js
│   │   │   ├── dashboard.js
│   │   │   ├── datatables.js
│   │   │   ├── domains.js
│   │   │   ├── endpointgroups.js
│   │   │   ├── highlight/
│   │   │   │   ├── LICENSE
│   │   │   │   └── highlight.pack.js
│   │   │   ├── inboundmapping.js
│   │   │   ├── jquery.js
│   │   │   ├── jquery.tabledit.js
│   │   │   ├── license_manager.js
│   │   │   ├── main.js
│   │   │   ├── msteams.js
│   │   │   ├── npm.js
│   │   │   ├── outboundroutes.js
│   │   │   ├── stirshaken.js
│   │   │   ├── teleblock.js
│   │   │   ├── transnexus.js
│   │   │   ├── upgrade.js
│   │   │   ├── util.js
│   │   │   └── validator.js
│   │   └── template/
│   │       └── DID_example.csv
│   ├── sysloginit.py
│   ├── templates/
│   │   ├── backupandrestore.html
│   │   ├── carriergroups.html
│   │   ├── carriers.html
│   │   ├── cdrs.html
│   │   ├── certificates.html
│   │   ├── dashboard.html
│   │   ├── domains.html
│   │   ├── endpointgroups.html
│   │   ├── error.html
│   │   ├── fullwidth_layout.html
│   │   ├── inboundmapping.html
│   │   ├── includes/
│   │   │   └── overrides.js
│   │   ├── index.html
│   │   ├── license_manager.html
│   │   ├── license_required.html
│   │   ├── login_layout.html
│   │   ├── msteams.html
│   │   ├── outboundroutes.html
│   │   ├── stirshaken.html
│   │   ├── table_layout.html
│   │   ├── teleblock.html
│   │   ├── transnexus.html
│   │   ├── upgrade.html
│   │   └── util.jinja2.html
│   └── util/
│       ├── conversions.py
│       ├── cron.py
│       ├── file_handling.py
│       ├── ipc.py
│       ├── kamtls.py
│       ├── letsencrypt.py
│       ├── networking.py
│       ├── notifications.py
│       ├── parse_json.py
│       ├── persistence.py
│       ├── pyasync.py
│       ├── security.py
│       └── time_funcs.py
├── kamailio/
│   ├── almalinux/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── amzn/
│   │   └── 2.sh
│   ├── centos/
│   │   ├── 7.sh
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── configs/
│   │   ├── kamailio.cfg
│   │   ├── stir-shaken.cfg
│   │   ├── tls.cfg
│   │   └── transnexus.cfg
│   ├── debian/
│   │   ├── 10.sh
│   │   ├── 11.sh
│   │   ├── 12.sh
│   │   └── 9.sh
│   ├── defaults/
│   │   ├── address.csv
│   │   ├── address.sql
│   │   ├── dispatcher.csv
│   │   ├── dispatcher.sql
│   │   ├── dr_gateways.csv
│   │   ├── dr_gateways.sql
│   │   ├── dr_gw_lists.csv
│   │   ├── dr_gw_lists.sql
│   │   ├── dr_rules.csv
│   │   ├── dr_rules.sql
│   │   ├── dsip_call_settings.sql
│   │   ├── dsip_cdrinfo.sql
│   │   ├── dsip_forwarding.sql
│   │   ├── dsip_gw2gwgroup.sql
│   │   ├── dsip_gwgroup2lb.sql
│   │   ├── dsip_lcr.sql
│   │   ├── dsip_maintmode.sql
│   │   ├── dsip_notification.sql
│   │   ├── dsip_settings.sql
│   │   ├── subscribers.sql
│   │   └── uacreg.sql
│   ├── htable-kam57.patch
│   ├── kamdbctl.patch
│   ├── modules/
│   │   └── dsiprouter/
│   │       ├── Makefile
│   │       ├── README.md
│   │       ├── mod_dsiprouter.c
│   │       ├── mod_funcs.c
│   │       └── mod_funcs.h
│   ├── rhel/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── rocky/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── stir_shaken.patch
│   ├── systemd/
│   │   ├── kamailio-v1.service
│   │   ├── kamailio-v2.service
│   │   └── kamailio.conf
│   ├── uac.patch
│   └── ubuntu/
│       ├── 20.sh
│       ├── 22.sh
│       └── 24.sh
├── mysql/
│   ├── almalinux/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── amzn/
│   │   └── 2.sh
│   ├── centos/
│   │   ├── 7.sh
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── debian/
│   │   ├── 10.sh
│   │   ├── 11.sh
│   │   ├── 12.sh
│   │   └── 9.sh
│   ├── rhel/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── rocky/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── systemd/
│   │   ├── dummy.service
│   │   ├── override.conf
│   │   └── override.sh
│   └── ubuntu/
│       ├── 20.sh
│       ├── 22.sh
│       └── 24.sh
├── nginx/
│   ├── almalinux/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── amzn/
│   │   └── 2.sh
│   ├── centos/
│   │   ├── 7.sh
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── configs/
│   │   ├── dsiprouter.conf
│   │   └── nginx.conf
│   ├── debian/
│   │   ├── 10.sh
│   │   ├── 11.sh
│   │   ├── 12.sh
│   │   └── 9.sh
│   ├── rhel/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── rocky/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── selinux/
│   │   └── centos.te
│   ├── systemd/
│   │   ├── nginx-stop.sh
│   │   ├── nginx-v1.service
│   │   ├── nginx-v2.service
│   │   ├── nginx-watcher-v1.service
│   │   ├── nginx-watcher-v2.service
│   │   └── nginx-watcher.path
│   └── ubuntu/
│       ├── 20.sh
│       ├── 22.sh
│       └── 24.sh
├── resources/
│   ├── apt/
│   │   ├── debian/
│   │   │   ├── 10/
│   │   │   │   ├── official-releases.list
│   │   │   │   └── official-releases.pref
│   │   │   ├── 11/
│   │   │   │   ├── official-releases.list
│   │   │   │   └── official-releases.pref
│   │   │   ├── 12/
│   │   │   │   ├── official-releases.list
│   │   │   │   └── official-releases.pref
│   │   │   └── 9/
│   │   │       ├── official-releases.list
│   │   │       └── official-releases.pref
│   │   └── ubuntu/
│   │       ├── 20.04/
│   │       │   ├── official-releases.list
│   │       │   └── official-releases.pref
│   │       ├── 22.04/
│   │       │   ├── official-releases.list
│   │       │   └── official-releases.pref
│   │       └── 24.04/
│   │           ├── official-releases.list
│   │           └── official-releases.pref
│   ├── git/
│   │   ├── check_syntax.py
│   │   ├── commit-msg
│   │   ├── gitattributes
│   │   ├── gitconfig
│   │   ├── gitignore
│   │   ├── gitwrapper.sh
│   │   ├── hooks/
│   │   │   ├── commit-msg
│   │   │   ├── post-commit
│   │   │   ├── pre-commit
│   │   │   ├── pre-push
│   │   │   └── prepare-commit-msg
│   │   └── merge-changelog.sh
│   ├── logrotate/
│   │   ├── consul
│   │   ├── dsiprouter
│   │   ├── kamailio
│   │   └── rtpengine
│   ├── man/
│   │   └── dsiprouter.1
│   ├── mysql/
│   │   ├── asterisk-realtime-config.sql
│   │   └── asterisk-realtime-setup.sql
│   ├── stir_shaken/
│   │   └── generate_self_signed_cert.sh
│   ├── syslog/
│   │   ├── consul.conf
│   │   ├── dsiprouter.conf
│   │   ├── kamailio.conf
│   │   ├── rsyslog.conf
│   │   └── rtpengine.conf
│   ├── terraform/
│   │   └── do/
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── main.tf
│   │       ├── terraform.tfvars.sample
│   │       └── variables.tf
│   ├── upgrade/
│   │   ├── v0.72/
│   │   │   ├── scripts/
│   │   │   │   ├── bootstrap.sh
│   │   │   │   └── migrate.sh
│   │   │   └── settings.json
│   │   ├── v0.721/
│   │   │   ├── scripts/
│   │   │   │   ├── bootstrap.sh
│   │   │   │   └── migrate.sh
│   │   │   └── settings.json
│   │   ├── v0.73/
│   │   │   ├── scripts/
│   │   │   │   ├── bootstrap.sh
│   │   │   │   └── migrate.sh
│   │   │   └── settings.json
│   │   ├── v0.74/
│   │   │   ├── scripts/
│   │   │   │   └── migrate.sh
│   │   │   └── settings.json
│   │   ├── v0.75/
│   │   │   ├── clear_defaults.sql
│   │   │   ├── migrate_data.sql
│   │   │   ├── pre_import_data.sql
│   │   │   ├── scripts/
│   │   │   │   ├── bootstrap.sh
│   │   │   │   └── migrate.sh
│   │   │   └── settings.json
│   │   ├── v0.76/
│   │   │   ├── scripts/
│   │   │   │   └── migrate.sh
│   │   │   └── settings.json
│   │   ├── v0.77/
│   │   │   ├── clear_defaults.sql
│   │   │   ├── scripts/
│   │   │   │   └── migrate.sh
│   │   │   └── settings.json
│   │   └── v0.78/
│   │       ├── dsip-fwd-new.sql
│   │       ├── dsip-fwd-old.sql
│   │       ├── scripts/
│   │       │   └── migrate.sh
│   │       └── settings.json
│   └── uploadOutRoute.py
├── rtpengine/
│   ├── almalinux/
│   │   └── install.sh
│   ├── amzn/
│   │   ├── install.sh
│   │   └── rtpengine.spec
│   ├── centos/
│   │   └── install.sh
│   ├── configs/
│   │   ├── default.conf
│   │   └── rtpengine.conf
│   ├── deb-mr11.5.1.11.patch
│   ├── debian/
│   │   └── install.sh
│   ├── el-mr11.5.1.11.patch
│   ├── rhel/
│   │   └── install.sh
│   ├── rocky/
│   │   └── install.sh
│   ├── rtpengine-start-pre
│   ├── rtpengine-stop-post
│   ├── systemd/
│   │   ├── dummy.service
│   │   ├── rtpengine-v1.service
│   │   ├── rtpengine-v2.service
│   │   └── rtpengine-v3.service
│   └── ubuntu/
│       └── install.sh
└── testing/
    ├── 0.sh
    ├── 1.sh
    ├── 10.sh
    ├── 11.sh
    ├── 12.sh.dev
    ├── 13.sh.dev
    ├── 14.sh.dev
    ├── 15.sh.dev
    ├── 16.sh
    ├── 17.sh
    ├── 18.sh
    ├── 19.sh
    ├── 2.sh
    ├── 20.sh
    ├── 21.sh
    ├── 3.sh
    ├── 4.sh
    ├── 5.sh
    ├── 6.sh
    ├── 7.sh
    ├── 8.sh
    ├── 9.sh.dev
    ├── INVITE.sip
    ├── Makefile
    ├── README.md
    ├── api/
    │   └── dsiprouter.postman_collection.json
    ├── include/
    │   └── common
    ├── payload.json
    └── sql/
        ├── v0.522/
        │   └── kamailio.sql
        ├── v0.523+ent/
        │   ├── grants.sql
        │   └── kamailio.sql
        └── v0.60+ent/
            ├── grants.sql
            └── kamailio.sql

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]


================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.md
================================================
---
name: Bug Report
about: Report unexpected program behavior to help us improve
title: "[BUG] Your Issue Name Here"
labels: bug, needs validation
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.  
Add any applicable logs as well; such as an `dsiprouter.log`, or `kamailio.log`, etc...

**Server Info:**
 - OS: *output from* `uname -a`
 - Distro: *output from* `cat /etc/os-release`
 - dSIPRouter Version: *output from* `dsiprouter version`  
*If not on a release version include the branch name and last commit id*
 - Kamailio Version: *output from* `kamailio -v`
 - RTPengine Version: *output from* `rtpengine -v`
 - Python Package Versions: *if applicable, include output from* `/opt/dsiprouter/venv/bin/python -m pip freeze`

**Client Info:**
 - Device: *e.g. Polycom VVX 350, Lenovo Thinkpad X1, ..*
 - OS: *e.g. Windows 11, Ubuntu 22.04, ..*
 - Client Software: *e.g. Mozilla Firefox 103.0, Zoiper 5.5.13, ..*

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: dSIPRouter Community Slack
    url: https://dsiproutercommunity.slack.com/
    about: Community hangout where questions can be asked and answered.
  - name: dOpenSource Official Support
    url: https://dopensource.com/shop/
    about: Official support and addons can be purchased here.


================================================
FILE: .github/PULL_REQUEST_TEMPLATE/default.md
================================================
## Description

Include a summary of the changes and the related issue.  
Include relevant motivation and context.  
List any dependencies that are required for this change.

## Type of change

Please delete options that are not relevant.

- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] This change requires a documentation update

## How Has This Been Tested?

Describe the tests that you ran to verify your changes.  
Provide instructions that we can use to reproduce your results.  
List any relevant details for your test configuration.

- [ ] Test Script Committed
- [ ] Instructions Provided Below

**Test Configuration**:
* Hardware:
* OS/Distro:
* Software:

## Checklist:

- [ ] My code follows the Contributing guidelines of this project
- [ ] This PR is not a duplicate of another open PR?
- [ ] I have performed a self-review of my code
- [ ] I have made corresponding changes to the documentation
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] My code passes integration testing on a live system


================================================
FILE: .gitignore
================================================
# dSIPRouter Project Specific Ignored Files
.idea
/resources/terraform/do/*.tfstate
/resources/terraform/do/*.backup
/resources/terraform/do/.terraform
/resources/terraform/do/*.hcl
/resources/terraform/do/terraform.tfvars
*/__pycache__/
venv/
# TODO: these following files could be generated elsewhere
# adding them to python path where needed to cleanup project dir
docs/build/
gui/modules/fusionpbx/certs/cert.key
gui/modules/fusionpbx/certs/cert_combined.crt

================================================
FILE: .readthedocs.yml
================================================
# .readthedocs.yml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details

# Required
version: 2

# Set the OS, Python version and other tools you might need
build:
  os: ubuntu-22.04
  tools:
    python: "3.8"
    # You can also specify other tool versions:
    # nodejs: "20"
    # rust: "1.70"
    # golang: "1.20"

# Build documentation in the docs/ directory with Sphinx
sphinx:
  configuration: docs/source/user/conf.py

# Build documentation with MkDocs
#mkdocs:
#  configuration: mkdocs.yml

# Optionally build your docs in additional formats such as PDF
formats:
  - pdf

# Optional but recommended, declare the Python requirements
# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
python:
  install:
    - requirements: docs/requirements.txt

================================================
FILE: CHANGELOG.md
================================================
[//]: # (START_SECTION HEADER)
## CHANGELOG



[//]: # (END_SECTION HEADER)
[//]: # (START_SECTION COMMITS
7c86d935be95d9838f45727025d442f55a8456a4
844fdfd70c526e3e3f4b94ca91de5a74bab12213
8261be6d3e1772d94acb1d8c8de194a0b4afbdd6
c1b270c5efb9f1640ed0a32a7d9c0d7f96b1a02d
58096c74533221acc325c101627b8f8a8ada1282
c8c6ba9ded2fc109099a8fd3c9e7775ea61560c5
a252b7e6646a684a44946f48bc93f78335d559f4
31d9a61fe5e5698a83ba460a347ca2d9d681904f
902c53e6ea1b56ba293362fd7147f954fe5b87f0
10cdc797dddb3053dfa574dcd10e5fe0696cffe8
2485a964ccf7d5eab5c719d9fe1d24221e79ff41
37fe6c03ed7e798119732367dc1896fa93d3182f
49ba3a7b761ef8f7c71de501c66bdadeeddc70ac
5995b5b7296506b72e5863aba07d1343acb9e113
23b1395497f61ec9a8f60ab63dd394397e1866b6
3007c0e8499cc95673704a420dee938dd424ef9e
e1e287dd579ff03c0407b90d047d76e10a2ad52f
8f427d4f46d64c4ead9c32402d56f509f63850c9
155f1594e37d88e14dc9699cc75cba04f3d6b2f0
ababcdd35782a7234b14e9a8c9630e2127bfc52e
73cb9b23631150873b18c39696018a4f599738a9
303bf86be04320131b8fce613e19aa71dfd7ce75
52e07933e0845f85c95c6c05af3e4a7b9ad3f2c2
a39ef41fa5eb058903ca03f8b923570aac7ff15a
3dd1156097fefd98be296dc312bbc03eb3c58002
fd1696c6f460afdac86e5e56414b975ecc3c37ec
0717ce38b28066de5749decbc3aa65bf65051956
b580cc323974d7aba05932392940050f14350858
5c5eb60127bc8b176e933c39f30a60a56d08a312
49e9c8c9f4ab16572259a178182437a5b8ef44d8
b46787c059a00d4a8b17a957df3f696f3dad682d
e606c4765084386cf03740c99cb8916bcc78f7f3
17a10889ddc23eee8f9392319fee27e6401bcb70
08ea093039491b124b09bd4b21f63fd629019afd
9e2e812346a002b11e66ef6bd87ce72e130b198d
f298cc3ba4118807586579090c473df2035189e5
a85ae0c02f89bcf0539c56201a58e5d01585f062
fbd0f7c84e4cd66e7f0d694a965abc259f333683
a638bc71661c89be5881a9d776b9f73a6ad0af97
952f0655d49ad7ab60c106b4f108945070b7c8eb
a058f7f1054f5c65c330f0424e732ce6861793bc
f3993379b9ba18b9b4a26eba2611c03ac64b568f
febc0d9073bf1834e0fc13dbaf893cb9179a82d6
01171453f8bfe861f37aceb332ada09057ad4b59
d61ec9564deeca1999c61f0683af50bf8b74730d
cdfda0c7319e70217b1d6f5570ba7d242e181b4b
fe6dee1e3bb7f94a87dca23d8f78512fbd7c03b7
43d053b938a14191b97ce44048a8751021fc6255
68a2dd685172e2b5521f1b698456b2f0dde077b4
4f2a9f8ad407110852092ce543461972687588df
656fbc1c50d503d7f14d13674da597ebc4e1f117
186f48f0d295f28527564a3dc3103cab8993f65c
2b76d501e66b0b22acc911e944f24ca09588cbd7
9b1cab3e12f978ae79c7317b530881a1c6cbe8ae
6fc2548389b0c6672f9141baf4e53e71bc297184
3f73914f1225b2836cab1f13e366582a61c183b4
6265abc736c8c08348a951da48b643bd67034b0e
b57a2a3670df1bf0005a4992f2af073e4d85738a
a977b58eee52a00f10ea32f7e9a05f2222037a3d
f47832ae5061628cef09e3198b7a33525f2cd0d9
f2a522d40e62c96bd1e55de7e098cfda9c98fbfe
92176ca0a908d5a778cb9a1081d7bd3a80df719c
50380c10d0fbeb07295d13cde20aa6ac0a221def
e6cbcdbf74426a74a890a97cd5a1ef93813eda99
14712ee1e39628bc178d8591e22d8fc6b355a21d
7a264c878a5440330ee03bccc501ea83c4fa33bb
2ab2a009610830601e70476cea99ec7d867ae181
36eb14bf4f109b1db9e11497f036f7768669a8bd
bda6aadd069dbdf2027b782e81a83af66e7e890a
5d95510edf523ea0be6d417ff69360f77eb610e6
223522fe8e8011377b663409529bf04eb74cf1da
96e17cb5f60b07b90c0f62639b5239e7e1e08873
c9131b49277ad01931aa7fd19e56bf85a4b37e79
a106f645bebbd0f39f073f2dad55bf8ad5733463
4f23a2e1158d415856c027cc516069d4be7b0b2f
4859f366f289a1e8aa03d19fcb902cedba2129d7
e8f8f8c07902241cd86428ab860dde834ba2977a
8c3d1ec2aec7952602f6c19af5d94648d272257a
ce9efc694149c243243e366d9303f12a6ff21090
a6690af4543a9458baf971404c7d21d03ec19bb3
a89c77066094932562cb1aee1ade444c1335b02b
16e7d16b9aaf5a230f1b4faa2ad032127befbe6e
db26338c391f2b39463967f03ec2f123cc4c1f56
ce3312c9020a8c1e208143ba51ae6ab19fb75fec
c7d98a3c26f298b4416fe27bb9ed6145a3eed3c3
77b0d03bf0c0ca0dcc9be4730aff129aaf2a0fca
dd4564e01ccc4d5bd3ef101a1d1abf368771ce1e
02207a75314811582d3895d35c2eabab968422e7
2302d89fd3752bbc6231f9e8131105a04a9f14ac
f429ed2052552e1d8ea2c8182ce4825b1432a8e0
40eac0dbad1c95998ca0b5346187b47abceb1f95
5a5f7558d67477c8b69dd1e23ac4f2ebc65ea2a3
84d1f13d647cc2d7eeab523587435e9fb36b1688
1c0b86cc905d6c6a1aa4a11b89eb9361fdd97907
2fab7686d38b88730594a8cd57d25eaf88076cbb
e1c2bd0628d34c0e32c48d7645810d29d9296718
db746a1ef367383edbc0896f52f31ef82f3e0439
ad5f92b9896911a020caa3971dd9b0a01ea56164
9c19f242e8a7ad0196f88a2078e0be061ca16cbf
4ce5a4a0d4125defd1fe11046d72efe8e10b42f0
db53233a086170ff69b829ab1a203ce78d404a36
582aa4c755a129dbaf30fa951232bcfc6b174c48
029833e37ba7c808c64a2062836edfffb0bf87af
96ae8e0ad6b59ffcfa5eb5e22071ef01cda3b386
4c603fe4465e0777bc9ab83f138b24bdc790857c
9e3fba57211e2d32b1d4cc2abca9d0212e23cc6f
4fadad93e3aa6411e567a424759a451d053f9a58
b4c5011cba0f5d39566336fd926158c4c0bcfa3a
9d1a14335d324a834625d1e922c8de2d4057b649
103bc6e4a3c22b37c1f52bdfa79e48d90dd86e2e
ba663bd3cc3c16f7c33c8f7977e1b4d5051efc0d
41a1a512aba83310e57d6c2c4d6e19a35a633900
325b4c18db320c491021681490d1bc364524b000
5edf7567a52854a403c21b66c785c4a529b8dd7e
472c343c957240dcebe500f405e3d818fd65f6fc
3400b7d680e252f1b193294c24385740e0ea4cf9
6bfcbbe3ccc56fef2378e7d1305751318ac508e6
8a9eefe4814db0d20e6d5030f6e9865f47711513
5737d1f33c99de90e0ef9188ca6c840292896567
cced1d2cd835ca6d546a22b78dcc6d46f2c1a874
357eca71bf3767d10f36b6e2db1249048a399c54
cd0db1a1f6bf45e09e31ff56e6e3541bd617ea70
8b79cd5e57ee370fe39d8d2234b995c7a0c3667f
435b3cadb5cdc837343d12c04199ef58ecc88123
ec09a74859312f30a48ec11dd57ed682f4da3868
edc1122b046b2948c5ccff28940693c0dcae2821
deb523e80b4f468c47b0f56e89480b8d19b2c899
2e52b3173dc0bfec031da450adc0bc06ff51dab2
2d2491605e0912a54a66a6e141b5f093120f6ee6
abc7359613387ce22dc82a1f8bf9a336835f505e
fe0127248147c98388771c02900afa45c17eb565
f8aecea6bd3c217b2073234c9f6ba3fae4c4e5f8
4bae4f3d0153a244c1441213327a83884547ea96
f833e8374efecbc4a9319251db9941f68f331617
17084e4bb069807f065f847086b5b002ff4d54ed
fea919d0b4f5184c4ae2d319ed39cfdfb1e3a1dd
351dc8ef45d4f09072584b1b906bc0b04973df8d
bda08eb49639f20e85563131cc2356770eaea61f
3408b9a6c8d68a473bb2b7a53ec31ceff6900f91
014c30de6ac92ab9ca51e758b74c8563a875d98b
b46462ea5d8160b69a7999de6116f0b2aa0c42ed
1c46e8cd1d1cf82cced662b3e6af94b667c77ac9
dcf2b437e94bf987e60d1c16bf85b331de1ff592
f0ac44f8041b10a3675f5a2accfe29199a795990
482bd41f6d5bc599e632c76095c3f0ea09ee7712
559fec30e82c5553b483acfe7c59d801d65cfd5d
d2f71046f6eb8b7dabc13cbb88b74d530d686367
1b8064c9760fd98037e0471373fdc6288f8c2910
313906939ddd7d64a3ef9562c3e86c7101bdff8c
1d7bc2d6a526458a943b79cc23b49169cdf4974e
9b5afa06020b84b598576c56edc09f3fa98be14c
3da760ed578537f9f39475bb6404d3931af22dfc
92eefb44fc4b1cb17ad9908a77b7587f5a408baa
e19f0de2ab42f6630ca65aff48a7cea1b2f656c8
9560aab94b63edc79181c8e973a226cffaf89aa3
59a745237cd9586f8dc2224a423365724a90ad21
8bc13858f70633ec2ec2ade2b878759a3d6715b0
6c73f8c46eb1477fcbaee6014e2a861e80f04c81
073aae22bea1191cd548d7ee676d571df4487891
0a9b0322870cd277aa41e0abb7f95ed026909d4f
2f42fe9d97523d96b226f74ad9c25f60ff3a992f
4ef9068ca819def5eb7df6abdd9f799c4baaedd4
a5513488ce466250a812748d7d757af95acdff8e
a10cce22b9a632e0b4a1540b0fc06ed42a4412a3
52cfbb1f29bb83db1dc2f4d4454d1da048f2a467
f1d9e0098908132570596a1fa9fd2ceb17978d14
1ab82314fab1f8521df7b2ec8a9954d92548958a
ee088949886ce13d66ddea732d23b51b90ee4ffb
c3eb4d56b294866513087636aa96f6c3a748982a
f1800b77e276cc28469c6f11bf2cd315271d6d17
a183a8c60c6774bb8823b8f73be8a414066ab7fb
7309bf1dffba660067e70977ec9f636eee86a510
8a2675034dd8293dcb3b1aa0efdb3641f5c1005b
5ec677df29e26d2d78251e8d9582202d50665ac5
8759e869034f9410f2622fed0ab40e5dbb107d97
75b3c327bbb19116894e0703ca417b8b1654cb4a
426a4c2b0a5bacc8f4727b2f35127d94237cac40
6b3ea5bb772a6e0d75eb91368d9a0f0a1e15c9e6
f13aec39adf65e0d750820e4f7851da645eae6e7
5a824fe4be28edbef8103b3cd1a8013f91e25492
9eb470f8a4dd79a2562395324c7d2e60583315bc
543e2f3a85e2256879d22f7651cd924b6fc47a95
4e748d9225c0471535e529d428247ec110caaf0d
05d8a3db546cddf462cbe5ba7072f940acfededd
7816850f83fad98085c3fec4fe1470c014f6b244
39fd67f26e204be7f0389d16f7f51bb51411bdda
a0e020d98ca138243813a25931ce2bfd44f856f7
87a29f49f7e0ef6e456aadfeb58d4c2155665999
53e56fa76503e703d7fa27170ed403927d33d741
ca380a7b55e3dcb5f1baf08c70dd734b917188d9
ca0d727353041c1fd1ac7a1054dcdeb9c927cb11
0bf4420aabbefb4d6d2e9e32a5f4ee641edfe683
2e00a284992b45dbf5d75c4de87f4704fd78395c
3bee7a4c7e837e0e8a70acf18a65964d6edf0600
b7a5a67c73f390e26d5d6d912a1a48d41636382c
d77f068ca08ee2c842a62cbcb58d7038bd138534
83d6af70e487b84ee55c3b9522410fe30db23ad8
575cceede455b4809e2da145592ca78b5cbf6156
fc2aa26bd5fc83eb74ab86f81dc9c630a777f989
c0a47655b5a2b5739121efbc9a0e03c059a291b4
10523849ac49dfa56c99eadab438d1f576666966
7cf4ac77b3693c06d94f6a3ec3c96e44acbaf713
44ef8c01b6c02603d423425141e0557cf7602a3b
c1f16fd78645972af29cede0046df2412d0f1aac
5cc5742704f45c6cffee27f1dda3dad5a4fd2da7
27dd5e3a87f3bac5942a454cd13dce5f5f60cfe4
32face946d43cbc0df179550f6d612786808230a
6b6e1b6dc489867566e398ca50913ef4be733c59
8804887bf59e6317ccea7e4e64d95d092825d9fc
bca5ab613fbb009b4b835e2903290888ba7f3574
17f6768ba9b4d3f58f20a2239f88b8728c67eaef
1d13139952f73f9ff9dfca79789c0ad1e36a2577
3882f40b0177622d09e4b1267a007c3911cae25d
bcdcf178a97f27ddcb129d830f794c5a3fe0c717
692157482f7971a2ce2c90fe75184b3e51f23734
b1f784d5484b7a53e64ffc94200149500529d3b9
64640ba1e2bf8ad5a2ffefba4ff9c00682954af8
c0f2604cbe4bed4a9681348ea7cd2ce4067fbc06
8630f8cee5b28b0ac9eaebf5751c1df3b17409fb
6fc903b9086178ddd02322d17b5999719df733bc
13989cbf1e16ee377db7ab6a4d1138aad614417b
a7f092254269a5a33732667ab0cae56c4c562bcc
c041cfd3e048e48df24d927680e38d383da9c126
14e8619eab2e549ea5522cc70f65ffb629d4dfc5
17bad27719f91cc0ba496a31453be46816224546
fbf026c7e76dad7a0f6e17947c9200b73b98c985
f87aa6653d56da4c29bef3c80aa1b94100ae46ab
de0aa6126df9eccf60d9cb1d921d7454f90e4aec
9e1a4649f51c94ff9f187a3f7ac31e2a8f616d64
7652a2c8b52da1097b5b2bf736f655547e13c175
d2d63c7bfc9a96a447e3d3d6e293be630d117985
1fe2f3ee3f8bfb2bfc1bed9a2a60e4b0c1b40b83
bd478e44de1b6a3a53018b761db19fa2b3de4e9f
5eac4d78b45be6c85cba5bcb4b0e18a3434be119
d755ccb6bde29d678adcc0b5373be9e8b65866d1
d906755d15830244286b5c7ae84168777e57b7da
65eb074c0d896d2fee33ff5424763187d4219cde
0a1d91c4ba6061fd95f1218556e5c8bd6bee8b2d
d4e003b62a7e28af4047926dc5c01019e7564167
70a9734b9d723d8384bf483c509c5d911f6a1688
25ebab6b83380c069e94c322049135363073bd05
d6af461097c8d15b052bcd478c618b6ff5e10c6a
61917b2d0fa7da63d671d9ca81d0c23953af5427
400837f00c4758b2344aec005c93f44d7819d3d6
1108bb9f9266eacb3b49a9ac3d733c76731d68af
8df5e8f8dcaacb911e03448982ec10f470dbd18c
fbc8e958f4c431dc26b91f95196f77013a74f4b3
80f143450a09cd7eae6e081d62a96d7eca14b3b3
da8e89e81c280e09035b82e7dfa349522c7b8e85
c66b16684b0206e1bd71907882bb64cfa95195b2
a53cd57604f817365dbbccde3741dbd83e87e722
78920dded1b5cd7afe0c8dd916b780b18e284374
bb168ab0f564235717dece05cd43a625e5da85b0
ac530a50b2f7c2e3e4c7135dbaef019ca00645bd
09d219da3dfa0c44ab928953c3a88bb92a4fc19c
5515922c7c178bdabb4d159ed167f21c63615b5c
60cbe341aaec7bc0447dc667a569bc205a1f06aa
aa2789a6cb688d9e9bfa30f4972a883dbd92145d
529685e23ec84d6da5fa8b945b87b17386cadfbb
0e272fbbd64c5ab1855e8d9ffa500205da93cf99
64b1947c7da99eecfb02530cf75c211ddc74c2b0
be105c9f5058d5b57470e15136dde89363353156
c1d7e509bedfbf6a8e4814ce021bbccf58a5b705
4dc7317a42efd4e33f341cd1992ea2249841116e
addbc3dea61239991370950c3f106d1a73a3ff55
618f43763704f8e5782258a50fd974ebec02cad1
1e603d96e885d05dd7c6a8008f34f7cf051e0756
13b4377ee5658eede8dca625e1a07705a3d6ecfc
a89a3bff193bb6c0b69807082fe475fae043fafe
8bd961101b57c5fa7254c6be4f81dc49977a3555
03a79b1b952fc523b208c381315d58a001fcc69f
b7e435108650eb13d77f95ced6e01fd4d9a3c871
a593cfa496a38bc552e047eba9b61174ea2647e1
0b6e53cda06ab5496ab7e9197c28cc9311d34b87
86f0006ee519a0e7a3a5863a7c781b824bfb9b19
8d4b1cc918e6efe4543fe693002c4f31a2d47fb6
c529665900eccccc6cb0eeaa76f12e13a95e7d7a
0dfe64bd87d43fb425da70b86be312e0f59fa332
532f85a25b4611e2b3bc98a1a2358891ed04efcb
1c255d5935685ba5d4ec28e4be3b67da7f993183
66001fadffe3bb7f231a2f2c9968f190293418f5
39180322dde955544c3ab31b8e0e9689c366ef78
58c7da52f023c6b5f4e6392c602158d1fe8a073c
8eebafba384a4604c3a754a2b9c708eae462b3ea
e856b11068c25bd8a5bfe8ec53629d94aba1c5c7
c6c4bb239aa4870dd8e24d24e68950ec76ece921
3df4ea7af6b656a233208f36b3b7558e07d7094e
b803e61f8f862aaee163bfdeecd587de319761a5
c38834a439f34e16c6a8370a1609f1c501513826
b1bb9d026fa0a2c5de1a28ef73f2fbeebdd39a58
9e71bfb6ef03e5ae7573adabf44578691a1b0402
239a79a38937b5844b47c2351118155642419320
fad1ddc79f5567760d323634fe09adb5ba8cf27d
5cee36cfb362c6fceb14348494749a93cdb1a2d2
28bf73e59979e32ba4952f8923db4aee3f25f87c
d6c45d81e09759f98a897d36fe73754c261f9d4a
29d9de5df30bdb2dbe0fb1d1de74c3e654d6920b
4b835bbc8546269a75c79fe7b81a6313af2536b1
5caff2334b4dbc19e315b98e9e3b5978d1a60a30
8796289a7fbb2a88a44883baae68259b944de22c
91223e1f6fac5d29ffc064745080839dc6a0892b
89ab6283a42c62d625f9a0cf4d48fe76c8c0049a
c9596877cfa5d559efe756718bb24370605c5b67
bed7432a0883791f9cca6913ab03b708f10f0b85
0f94ab7184a1e81feab9d5154226630de54a720c
e32711d41e34c6e07ef5bfdf48eb3b14cc2f5e4b
ec3d3696c2c77ef8c2715c32a3cb001422e5ecfa
9d11a5062fafabc3f39573c583552e6caee2aa51
10f4deb3e10de44df76acb637d7002fb00907231
1fa981a268f0a17f1d3ec33ad05739130dbf3315
5b9cbccd2d522d713434ec0da90e10c9b26b665e
8c5e8907aba41c1b92adbc0f19c6084e0502a08d
cb9112446174e67633d26ec6b71956060a8531ab
8b1ccf2e53f1da403341957b57bbb4c318f64330
ca9e5da8c80b3f9fb09752ebd8e1d2662a55f59a
d663e2342ac65b1d559376fe3e7db6582648efec
71f2577294ad7dddf7206fe30a362d29880a124d
768793973e59ce600a909a29d744e5edaee3f934
0e7e43b0471528a7dc9175c0939bb93bf9f34c85
997f911ecce2f4df036a30bed2e488ca983c3fba
e1f402ac7faf5604be924bc693cd389fd4ebd3fb
6d2aa297487b38829ba832aec10ddc1e3b3d7f10
8adead794dcb8fcea85b07819c2738ada08771ae
55ac4519606a16f54c383c6de10d34725261c8a7
d4a6a915bc7a4ef12c14899214df01a840c4fe01
51eb9e2614dae7f49dca658e10c268433cf19702
350e777e101b3e0b70134f8571a598348ede7d44
904879953e2217394b364f7464101dafcdce5e98
94f1469f2ed8b7412f8bf2f8b4d6e644415ffefd
b69eb35a5b634101080a43c52ab323fd1ac3faa0
e4e43e45f6d1c02c0ffa91a77719a2436dab66d5
5f3fc87b08437f11bcd55d92618f5cc8129c8931
8e0fae1a415b8e13427bf66489fd33f362054785
e188ee0611c594e582f7b3c18adb2c65ce2fe3a9
5d5c37dd97e4337a71782b42878114c1ba391dd7
49c5034d79504c2558b57d751ad1bc63006ad2d2
fc1fc199a1859d5f09454010c6e5d9e91d6ad68c
84c412b8cd2e945e630120f567402f311defd46e
473fb813f9d5ccd80270d63d67a02d31a95ce124
b51c7a8db53f623a2dff1f84ac004da9de06b4d8
e2a6e5fc12e9ce7015a7e73c4a93627a24fa93ce
709d07e8f693bd7fb2899735f3ac0a37024f211b
035438eb210cc122a233eb1c1543946f0bb890f6
242f6999566658e2cc385639da0fd5d169bd1bac
626da8c3d4947651afcbb7061e6cf07e2bd3739c
816f78bd4adc634bd31ff95086f27813b78dcc41
2a54a13ce90f9ec2b0907631e9995457d7f778ef
3209ac195e1b47e42811a44ce5affb4764d4072b
6758cb002b0bbc88e1e8c736f4a770fb190accc7
d8c889ecc66770e3d388c91860bad31a68fa0803
25b049f577776529d1e6eb1b651c895eeb8363e2
eeb1eaad119a1ee5809f88b9af203956fc7f02eb
86cb8df0f93f1a6cd07f560396de031e4a7abe08
91d62644a07fc9b3693fffbb3ccfdcbddb4db794
7ccb9c615e62c349a67e2509eed9741d5d064cae
47c73b18c4d1eed30af136cdcb36f44fa8f0229f
28309c1a2d37d8ec3b3e3bfdbce1afda1c33ca28
e0bbbfa860e57f9549736149142c9df8be72433b
a659fedb44ef2a844282d3de0d5503c567837948
baa6415f1d630b695cd28de742ed609eb65f1399
bc560f0fd419cbe271e22c0801e64e92a9469397
0209c81fa9302517ac674725cefc1f4799d70d28
c850b78988eed29591fcacbc01d4c26f2f49c22a
36297d60599a1f214e8d183f978d2688236b4479
fbeeb172c70957d7397f66a612811e75fd31dd6c
2ec6da12a319bb378df586332c56261484ae1ace
d2b1e55b3a9ea5743f68389a1ef864b4c06642a5
4e717ae72b7d49bd35dbb9d6bef4b37b3fdb66ae
1c939ac8a7fc954a21354672fab2cb0e8f877ce4
8351d90c77289f126aad66c145eef2dc753591e9
cbea100db0f75e72d39ae6eeeaaf6164221cdc4e
7b883cf29bc9ae40ad5cc09a58f9830a4d7a8942
5674c7f6191b002b43d9f2e89736b26c890e1ea7
852f7412f7ad9c0502eaab76579a6e0f71f51f60
80ae06ac5d83a3d219cbcca7432cae4de6403fc5
669a4e115aad6efc4027cf9bb989e0fc2ea52729
898f6dc5d884c92a049e06bbf4b3aac1f2a01f01
5f7bec3e9b4802429701f3cdbc159ac379370f48
dda4c22b944c3a1972fff24cd112a377b92f8d64
9ee06fb3c6c2f1eed7b2db7bcd750ed152bc8895
5522370d4d6f461c03c1caf31d6c7bebb90d9712
98e5622375544c0eb7ae3f8233dc676f01de80e2
d43dd36b6fcd625fcf80b9ce7cd380cc699c4666
b599ffed2123ac4a8db6e572d71c540e44031ca3
4b5f72a3b6d30d2bc660e947bcb2f924785979b7
8258df375bc73cfc17b19cc92cc1e371295b00e9
fb34d3bc071c54e92d5840c5c818bdb79f8209cc
1d46d255fed53ec1511b103af5a99d64edf82edb
a1738ef6ecf934e6775afcc7045adac7b1e31819
34cd79c63c171b3bcb8b37a6857bb386b0aad127
a54465a970ab50e701cf5a8c44ddb2fd55f6acee
2953f326f02116afc1dc4fb5acbb458c63dba834
6843ead09ca062c856a7c199a247aaf817b88306
b935436bb85ffc97b3abb14458ff6d8de657f204
96799b3245092cc24ed082212edd023802ad60b8
c08a7f914caf43d37ffeff09bb8f9bf75dd442dd
05f1eca4837d1676905d882a44d112de5c92562b
6e931ce7092aecb7ce511059b3e40d4f6b1c9fda
aaf31fce475ee60b5dccce765c34d9208a3af280
3b341f4168e65f653fdf7191a08978e967e86237
b926ea7f70d26818a04a8c75b68f295cdb8f4978
02ea31c21261e6c9c374cf51e67484b0d358409f
3c29315838afcc70648170e0cd12d8bcde3cb6ae
cce7d0412b19159e65436c667241a7580b384263
89450c0d2b9cbff0f9c5360b3301811bde4a17c1
41736eb05ed2c9469622d49d9f41b7bc5b8125d0
a7b22b34d458ba0b53af1bf452064caa61897078
e415705f275a8aa4ec19f595c156338ecbed1075
e24d53894f2f613e8d76d61b0065fce3fe63adcb
2c80df409e6cb9e0782d6f7544096041ebfa225b
69b735d9bf020d111d5251e70281767fb4e94faa
7dbe2558f6c045311ef043f2c5859c711345491b
33c3bee02578082f7c3192d3496b0067af992f9c
f0f02584af775a85e723c6ccdb09db2c6141a145
d7f7da68512e560bd9bc5f2dbb35b07e6630b7f9
eb720e2961d73a826fbd6fae55a0b7e93eef25bf
bbcfaeeb0d88324f3dc8a9a85b3875e7ff3e76dd
050f5fbb39bdb1e2073fa98fb471acf01777f0f1
94bfc589ae9777163855e52b511fc90f3f4adf1d
13fcb33a140bba7391d9ad8b52a1aa7f25a09955
72cd4261677d9de449577489edb50fafce56b662
b7d9a30838189b0e240a590f610b66505d85d0ec
8e19d470d3fff85329e78239c84e54998f39f247
a1a55ec01f46433fb7ac64eae58089cc8e506a19
5a34993875502fc1cd9f21dec686a3035a8dcb92
8cac48d464f70bd5da4c8227abfc7025a23a82a0
63ac499d92fac90f8bb1c3fabc7c03136abd505f
2bba54fc6e7061893b205149d7c9172c97239cbf
50348be3339f4d3f9be532dcd4164964992bdf17
a1174d1e922ffd85eb767b7047fb84e3e3e0745e
da72adbd503e5fce324c8a801d90c1e0b38ca054
2a19a64551c0a191adc60a956111f25b2a6a340c
6dfb127bd0e7f504522e80a4ad60ac01118f2c6f
bb58600d9294fbb5ce39c2e273155602d7981638
cc8a46218083c85894e090228f3cd55eb5a238c7
681c2c432b735a3f67d6732264f50638b47b1552
799d68b0365eeda8c2d17811575b925a0023ae2a
9a82a5efab8b2d6a3bed6c0611888b0a191119c5
e354fbeb2467854770650aec659d98b27dc8d464
98270d267c77f991b3aecf572d38c097fecac68b
16a5a16cf1ef8a7aad44ac3d9da1e4c8706fac35
4082e01348c3279f71685ff9eeaccaee25a6e53d
92d323dc7d6d82645ae7c25a4134679009dba4a6
0b3ed50bbf81577558e79b77dd8b2c65f61ad034
203f8ea5953044b05b047a5565c36c23155cff43
d2144a88b8ccba4dba32265d69782e65635b4997
af39173450198616f9e1f959f233f980a65a4d47
2f31989a6b34be6d213a891c3725dde6c168f2fb
581d8ed65958db142c9c64e3d6f973327a626fcc
3b02dc02eeaee8d4e8ca13741489c2e6f72de230
63dfa5ae605542cb998a8b03155bdddb75bb1472
a787ec5760bf147c755950116a9e440d181a2e9d
35b4d7233eeda44587c59f0593f5599f82898f65
1fc9ae71deb1b5191c68a3171bf9b5269e198b80
200cd34e29349b99b6da38065cee4102e916d98c
cf5c5200f68b97d88ad2dec4331d04db3e189a51
ee072c3650e9a008900cf00132804e83af3fbf56
90affe1dbac937b1fd09e2d5ba90ae07491948e6
0a4cf6a2b0a8352659dfd8145692ed6147ba3694
b26b91e04a541685d0d5a78277c4ab7bf564669d
f321abf3809cc8b6696be3b6423a073a76f81365
84bd75cd3f05b01b765ad8be4d4a096681ac681d
4452960d95d0bf8e6c9e9c8d60b51b376f6551d9
3341101669b42a7341643d13c284f696da4a0caf
f53bfa21e447f53f22ff20a2a64b7b859835e8e6
591aeeb225c1f542bb49a078d6353a7083ee8fc5
c1e0be12cf158786064bc1f1d1c4bdf3db2159f3
b3a9b851f5b0c095eede8d5913f102b4f62b04f0
cdd8aac9f751a212fcca7f01e7a5159d6ab749f2
a1cba27cee11cd0de0a46ebec89c65eeb86a302a
c3fa6d356292be28d495bdd1a32973880bb31068
b3f6d0264ce15c28953af1f995738d0d4b335f8b
3238a10fb81d182766c38caaee646e3f79e98e71
a8185ebd21e1e7b26aeadda1e39c36c8d9278052
858d692c20fb15b7e897c58e428ed094423a136a
53d99e58631b8304aeb76ca3e0b62143dd445f68
224667b7be2a2416e73475803fd164f99d1081da
6721e7478d45d27d4af231c34c270a87f6d98b75
f2a5fd1d4363af84a8bbe880bc807563bc00ca0a
c854fb813aabca89cd859016f9b6c9d24d2988f4
7087d856b39143ba0c9ed14b4ce5c199152a9687
6e25bc7cd582d62cfa688c2203be577804624435
bfdc34035cb07a2272672d964b855c64b81a63c7
c121e97d6aba9f566a53f017f8695903bee03556
a1738694639365fc09a7f4c49ea4f94bb45d5d2a
fff6275b60335280698dbb6a609a1ab34229542e
2cec15e1f3d8d856511225cbd305a35ffc7d33ba
921d13593df8d28e981991d9a5e4aabe5ca0fffa
c5e6aa71ce58895c10091db1c7acfac7bb53cdef
273915422552702005f6ad070f3c726ef4836335
0b07c0332e0153766bc273f29979cf2beec337e8
ae07741723edb6b01165ece997a1da2d172fb50e
3e684eef5ec045020461fbafe4ce58245a096de2
bab65db299f3412abc5fa28b2dffc16aff574c55
c0478fe2ab8142e746a703956b89a3f5ec69f524
fe84f3a2e63bc5190493b469fa2524ddbc585cb7
a1d72b29d902e17d92a80db3eeb00b7d0e2d7123
1c4ffe41812941046a1cf1c1cb869b5021273c88
94b70f189ccb0199130e2abfc9a87cf9c9b193a9
f1bd6c453827140e70170b7cd86de21bf5e8aeed
fe91ef431b330c83f063b8251cbd3fc0bcbb7d4a
287e9f6759b3d18f48dbf6ca170fa48be2b00c82
460f0c26cd2bb10b4e44f1f62024525d7b1eadf6
bb710c9d8412c556055e4f49a406bab60142dee9
93ae11d1afb8dc6b94739a56bcf278ae3ba8c112
d5b61a29a7bf53a7ad91810072e4737d8939c642
3323aabfeea77579cf71ce92bc6e615332e5390b
d32faad6427e6fe36d3f643fdf8585d01f6452ea
c028ac3999a88df3c2c62a342e1918f31ea9f0b8
6b1eec58bb6b77641f782b5414f0ba2980fb4317
6fa0a5b3ae7d5ac1d267cfbb7937a283ec3c3598
e61d6d6e9ff125381d4813a5db0782eff5066e66
466bdfbc9a916580d2e70950af6fb54ef4cf8bb5
b5e8df8a4d4b82994d6be2b6a0dbbd26dcb34e5a
431f37ffd6cb1daba38e2a6f654da35dbd81c3a2
d50f15b4c4eb65069dbaae31e3bc5b86075bd57f
56c39e111ed66326b50447bb6ed12826e5cd74cd
96221e574830aea41cfc23c9237cbc6a336a8e95
ccea19047f2b1959fe0bbc0e6cf70a66576e5d15
1e029d26dcbbc3ce204cfe49d25502d1ec23355c
37b20891477f13d5f7d4bd166cf461329d733e32
781eff6363f2efb44e47ddb863651be491421106
9f3515967f6a05789cce7aba8b03bb107ae5582f
99fed4a8840a27dfe1e4de27b95374787874f71f
dffdbab53a21c0b96b6fca16f5bf772f0921dcf8
000e370c48da86b40a2d68259c8f42238ca83df7
d3b28a7ce77894f343e51cd6a9bbd78cea91c1b5
62080422649deb5cda3c5ea671c1deb34e256b1a
0391b278289365f96fc6508b6c7da7e49e01706d
48cd1ec6288a0ff4eee7a80b8008f2cd9cd05aa2
06ca6ce25a2c753d46405b198407cc7db62d2b03
1e1bf37e1dafaf7c366702da190a778a0736ea02
11bc68b1196f2232e074eb965496c77182d2155a
383a57bb4bc9ded9ad28942670dcb7a2022fdaf5
d71a50bd712c066bbd538ecee5a3b089d1e4d829
b4b5cc7f8f826c07956bff054d30c84ff5e8de49
9c62c9ed74006af75e9c679498f5e91a39cf9200
6f44e913e57a62e8f4d4ecca83fa84cbf35cbd60
5e305d87a1466106c6658c64d1454a0b1e44ad36
912aa73b0dc8f3c8bc684b22e92f0af878ba1a85
362c144d2ab056c0bfd03d8221ace09767ba5841
08458ff1258fa668ed48edf0e00b9bf6aa38f07a
42681d1ec76c6b4b64acec9fa44c1c1c8821be56
c40702e443e6c3fece31cc66338d051527067d88
6fa6d008767b45244978e9b0c53998f5cb3116d8
92689753326c9a96f642d5cda16b08378ea96c7d
7d76b585c66154d3542e92329c53ae313b6d0ae2
2466ccf4a9638b5428a9e515aa47b52e476b1840
4a3ad21a37a98251a2412d22294faf1f81df6b1b
9c2fbcae2aec2174783e03b53e978e7a9fa62a2f
5cb96769844687f19c809c8b25b37e595256a4bf
43da59b8384e66f889ae00548fbbca76c55c6bc6
56d29640a2d9e59628534fc959b7f66c4eae6673
34e30b6dc3e50e80f8cfa229416d4c409fc49832
2a362b9331c4ee2e7b5473712ca54d98643586b2
3ce7eca6f9e31f5351260e085a4e720ede16d066
1ba6465cfffd6c80d1e0f07314cda1eee1dd25ed
6a9f9b2de498ad93c7d84e92f7be8c43d7fb146b
bc32b97a11ff4729a060685a30ae8a019a5491f0
6fe3c84fec77ae9ec554c2eea18eb74e1982bcff
2f6b076c27cdb5c324a9ccfeab9960c6b8952ab7
e9f3dd7059bd73e4a73ebee4e5eabd7bfaffbdc5
162e3ed4fdc9e48d0f5e2c061cbb1d44db317735
34e29bcb6fef9fea67de067928e27aa861ee4063
c879639b5cd8d54da6e96ca9a3f474e734d14594
c83d719784414c97bbf89b9d6f991582b82dfaa1
6eb5efb7f4a3be4515745cdbe8951c5ee5a3b14a
c809094393142acd2ac025f641d920d7182136e5
eab2b7b5092a97bfa14369902d5701ac58313944
26294003c2dbb0f98ba0fbacd2498eb91fcbf0ec
f477820eb11f1af06e73b4f022c8059a4e6b78e3
c71a5ca053c4deecd0843da72208315964c45569
2a2878e14b3a04aefd74efd015a86ff7d4efacc0
6b90261785a05f79a7ef429d66e15302409f9d78
a5c9d5b01d592c3d619cf7eac6ac86978a2a159c
d7733ecb8cefd4f46b082145e7dad84b3d675389
4d4db52fab645f470698e36b2c3580dcd6f7ad8f
e2eb9514adda76bfa18b23a58038507d9030f5c5
c2a9e73dd7a7fb9a04aee38b259f189f5d0bc610
de7ec6b999347b86b156ef40014234372912dfac
f8fca5557f1734f828e5f8f876a4f200c7993d37
f09171cd444f0f5b0c5570d484f18526283e6cdc
4c0d9220766f3bc7794972a5796ad898ec6ad879
a3b873763dc004f2739099f55161d3e3a5ec671c
6b717430ef4cc75169b4de8573ba9222dfa32d13
11659a3b1a6d9c951a61c812e63d73de4a264270
4ded45556e2c896781186e19c843cc298e0cf140
a7a3355724e86989dbe1d985a63274ccf29251f2
de781ab923da6bea54d6e3998d63fd8ceac1291d
74b38a9eaa123bb6e97aebf90d2d186f27bc6a4e
0303d05981d4e72ff831f582e0cf232ec804d2ae
2d053086bfd08f11997514781f8949c9fb4a017b
467e0353d1ed92c2cdd297b4070e833f8f269313
1398c9f37f6e2aee88fd6d62ab0a1b50ca4529d9
ffa050d4259d859128d75f34368e0430005967a0
868444e2dcfad98ad93fba8bafced1bb0428ae39
6f7e10ef918323380c8f2f1147c443608206d92d
d098638cebee6123d756893963770e245dc96d6a
60afad7298ae532c4d51a6214fe118b0c0442a0a
dfafb9953c70e936ccb9a3c6772993d43c9be4cb
f5ba6be88f6da2d66c52bb039f224b274cb68ca8
fe8e22a60b89b11d803880aba12a3bbfd43d37a7
197eb7aa1b572796a9a1b9fc5d8e8bf52c85684b
5f442e34c294153e1db463c432a0d73464aca3f2
54d48156e8c9953a74121afa7173cde21f3f466c
f00b06f414e6708f9381a16a2db46fe4e60e4ab8
d8fbb36687663b2b5fd474043b63732bae8980fd
28a6cec3232c02ad1a55b856fb667a17f16e157a
660a32a135b8bac31aa59c495ae68f9467193bb4
87d4aed54ceb44e31c22a0cf0e6902d3a09ec84e
323f38bf35f4078e9896a8f01a0535832c68ecaa
e8f4ae98679f93c18759fb23153dcc61060356cc
cd7860138957fad20e630957d3352d31166c42b6
8049a7005ab453e7d10c9f5cdd1e0831ed5374b7
9bd7986c4952c2f473c2fae2eee8ff0aaea06a4c
9355e5408640fa412254ed37ce3de0789cfcbade
24f390f44aec775aceef7578ff75809c03142b39
f5017f5afa9e2f2bfea9fa9fb20ee8989a51ab2d
1254e8e3d5cd29b3ae67ff993a0c110e76fac270
a8c0496fa2525513d8cf81668c57d783eee299d7
5713f323069a50de8d0dce8bd2953e1d142b46bf
cdecaf5d747f681ee6addf2b2d6e58479e36da91
ec4219de84f9d346f082fc668d5979aba519c047
d7d03e0bf8481ce48fc6bc5c8d7c1b56fc46575f
6c7532ccec112d6faf8ce47f1d89151e4a46f316
1fb969abeb8eefc633be50e11e3905d688526cdf
64f141ba6ced44e6a0b9f1b1680a8edb5755415f
813dcdc3199fa5157a3b4a83dd52580c5570e659
a77ffb5e2988d7ebb01f59464707cebf33a0adb4
863343903605d610f5b42f72805f993c401cc862
26f16646507d81a840cce049069872c431905ca9
3b41901eb9baad1139d245b6220fb502c7c546ca
e44d74fb9848cb5812512da7e216e73c6bbbdad3
9203d051d69e9176f2bb659c70c29cceab90b084
7e4b557bccfd166ac746c73e98e7c76e6c2c9d57
6757683347f947e730ff668bac4a3d578b8044db
1bf0cc47ceaa158aa24880be5e7f9b66dd67c956
063aa3646d4e6a39baeaa5fa26bc329139f05914
a1f4a720a824ed2e11d64e7fa22bfaa6a2da7eab
01042e110ecc152ce807322aeb53baba5c06bc2f
a495613e9c6d52bdf921c9d005d4b7206ed6feb2
f59ff1f05c8742ceabc0903bf453732976268ca2
500a9c4cbe3531658e7b6fad0c9298dc38e504ca
da5a1a010e9c2950043daeca6766b5c1e5f01e9a
9bd78475c38ea4e4a2e91fbdd3d35e79ec292cf2
00512092012a8774bd3e8bb1d98da705f3ec6515
fb295b01df70c24b149e0ba5e4dbe2078acd2c46
302f209612217053c796a452b904062542326532
8ac9a1d9a2c1966591ab441bbc75958c09949a0c
da57ae2e35af3f04ea35987b06bb5becc0801f9f
55ad40f4723e2ac65f197f32e7f00983ee0a464a
34b7d1942f56355684c8dc5b0cc3d0100c72184b
e4539774b3e07c22694fc62b945868db06ce4458
eff0125c1711790734301fa41e4c4d9fa7bb9d85
b62c3850ef95ec00a9ee8b3fb27686002999c8fb
ab11ffdb7eaf4219bd35fc99e2c62029736991fc
7105186a5f9a22d9a990f683ce7774ce2c585674
c3f5eb7aaa55c037dc5b466cdd1aab3a6fd6b98f
2a2757d6a09801fd30a29af2e0b05bb8352c1f1b
3c66751cd46caf6e8744767793d15ede88a9f5f2
046abc390bf18c6bb5fcbd178ed711d32e507e77
bd4c682017cf089392a47c3f0976649c11ba39d4
9d0f4034155f29da792dad6cfe72365fdca2ba1c
1c3fbd9772d7e68cf002a41646dc519343a180e0
a5ecbd575c741b310e885f2c83e4027a934e6f64
0bf43b396c17bffd42906533d61fdd0d4e8711fc
6ad575e55af96adcf468272a6c6387db9f866505
9be69cb27221c22a01dc51da7640edd5ccac0ef6
8e471cae6e6bf94b9d4feb1675242458bade2b5a
abf8f8e90d573342aa0e8ea3bb13d507fc31ee07
9d65dde56b73b840e1091ecbcfd9c52d3905359d
63d11cedc8133bbc611e4943463ba8c8bff88951
4f4a0f41d268ce510724e61ed4c9f77a1e23d666
d6332da4c26f86cba02a24ba1cf9085a6ac49a77
2f3505cebb8048a3ad9eb3aa238a4527ee8a354d
eac246c60ddf8f940dc40da34fa8b458ede41004
6b8cf1705666660973df8888803d5f0c132227c1
13ede23fedae0ca8a411d7adb75bffbe4d2e9dd0
8871255c04351ed846eda1ecbdada488c32b6d38
4d2d5345c335af336b00653a4b8f727bac942837
4ffe5caab5d0835e7783d7c552b03c4b55d15524
fcd92513a0a2aee5c64764aa5caec08946459fdf
1b213a4b393285804fb16547590ff56e8f573544
f34291c8c07d1a11226e6d0d6261b32954cb4779
b2facf0143258ffabd83998501dc324ea0d70b2e
056aa54a151d5dd84b0dbba14764dd9689db4bb4
ef947db13678ba04d0871075388ce2ddbd29d3e8
b94d77600ff45d7546888426cab34a326f0c4d45
e36f27762b584aace9c899de266e8a9e9cfcd4a6
c5a6ef31fab26d2bd21351959a0527bde9540736
257da44dfc069b910558e7fdc365ca204e44f9a0
1957202b3c57103ff6a2ecf9dba1b7caa59741ec
24d2dd3c20990f6c38362e96cd31b7905ed72c60
e7c81b1ddb71e72ae3f9fbe77c3447020240e308
59d25e84e0d747cb7e8fd10cd60df6689fe0b3bc
f80ef93a71dff7ae697bff7264a3cebf74c28163
f4a00e67519f6fbd9399db44a880634489676e5e
537136db933b369ff0dadd0a35b0f8483fd1f5dc
e40a3e109cbaff6d5f4ae9b1cdae253f96b3d407
d6d27ab8bb68fe69433a04eb5854656dc88e7ef3
5a193675fb7907390631c620e2f98a12266347e8
7ddc87fff9a6e124d2ccb1ec772352c4932446f9
48df26485429a3c1e785dfa82a1d64a4f3adda73
2ffa80464ecb90ee77856939114833c074327cb0
0dc523c62986c94ec14f59cf522b4d539420f5f5
646167fb8dc29f3b080ddcf112b5e75dfbdbb9f4
191cbc48d3813ccbf1d12681fe1084fab3c36696
d4dbff15c352ceded8459413be316c62bdcb58ad
f8c73f821435298e7e6c388b26a98028b03d9ce3
a77d93c7735658c3a04a7b6650607bb126ee2b53
b72dc72adcf40fb62553db673ff70eef39220c96
17f2e8702863666dd08403219099347711724310
8f0d229dd89916ebe800228e94518a6ff2beda3f
58df9f2d81b8094ff3f29a1c22b4de1b6d7f9eeb
eeeb6cf0977ed3ada7ae47fd5607d0e22536b191
c92729b89c5365414978f70453704d099e491eb9
eff1a89624a28f73f080b92d3569a746933518b0
b52e1ef20efd0bae3bb2749d28ce01bc59f8c84d
32581310a59093e773751cd4753a3e156e89e7e8
33535467399804add0ea69b5e7faf71c695014be
21798511e6d33e40efea39d6ab68c640693e81cb
886a9550c56d9317dd85494e1719a3229348fb3d
d877f331b9bc248b9880c2edb099104cea420fac
d585223c6a69512f4cb56d522d460296599a69e6
2a2131710df199e88189091ab16f307bb1089988
7da872d4edc18917deeedc4dde12f9bbe57a500d
025e5ec18575f08d2306a2c9ca99cc87981e9ee9
e809c5c57ffdf627915db95e5f94e895f90291bb
3db150d5c0f6dd107902b3656026e18711f7b959
2371850c27408aea29c0e98b792db5b548a32eb9
03493c243c12f606f1a5716841c2e7eb4185f32c
916e120ec3bbf7ea7089e93b8386b0facf00c4a0
76c7c679a947122e08cc5985623bbefbeb0681c7
085931328e9be893c65b674c9e491924afa88ca4
c569928e35f25ab269b0aeab25423093f9db96b5
195bd8e7cc20468054182bb08fac2e80b80a0bea
14d26b51fa983c686b95a60afdfb145ea61c1bef
cff105fd47bada8ce5bafe07a5e6f85ac2b8579e
85874fade92d329fb0f6d7f824e06035f83eee97
681a80c258d2011826c12d52874924843f17728e
9fc1b9c95e1c930caa9a711477e29f8ac94f8534
78bb2e6ffb5d7e3d4d78ef3128bddb5f1f83104f
f74db4f6542d0f008fef614440e195ff724a7879
a409f4049744053e5958ea885b5d68524f15c6c4
d182417156ac4af142138abe951aefd6dea35259
9e45548eef592b97967607829e844913b6ced577
86f9fc51b25f749858999ded032aebda17e7aa14
24a5c2115889e874b9c95a9ca1ffc59c80932d13
3333a6ec58d3c2530f33cf8132c18862c29d74ce
702a0ac1811870197e64aa3dbaa04b9d9afea29f
349e8b733e16eebb7ed693ff5bc0588a3b12cce4
04f2417b5cdc29bc08e217f8bf6f2a0cf07fa3a8
5793453bc1f2476b4361c762611da08325fded96
62ba43bb6af91568e53e5ddcfe29f4740ae41788
9ef7eabc2075f31510565bf75226e46d30511cf6
ba3af5641e1244e52b148dd008e544d4631c86f5
24b32c7b053e73a0a3646854c998a2fc6c653ee4
a39fe323baf2b64f2b79c021b2767e05b2f98f7a
383bc1773a09bd9d2356e788fcf7bebadee489d8
0487fdf7ecc14fb4eea84f2ca8dd77d62191df0d
e29447636011bce47e75b8943840e87ef4db9ee3
442594103964d1441361071ae1f367dce714bda9
d39844eda0194d17dc47d205c5bc80ac1b4bb296
a6c9c5a3fd93382c758002354e5e362516e70be7
b883b914b2ca6c0e6d9908c4611e9c4251c2eb0a
348d856841f14014714bc55206cdbbfb4c849445
e17b362a94175aaab6ffc9e711e95fa80df08acc
b04ed0097dd4ba5867062c16ec2d654e72ac6d6e
315cbdcde908c5e94fc7f283c2b9d0c76e63f4a6
7f50034e56da5e6562eb3e03c813263a5c13fbb7
52f64d507d7c5d867f3d8fbeb97aa52ad664ec36
302a6275995e2398f18aa59ad871554456d4b68c
979e7f28b2c2efbf113f898b689d6603bfd274e0
7507cd91dffe48de1b52cd1060610332753dc890
bad92e9378ef8164cd37f1c190f92e08ec4c5836
e8480a8c7036b9965c4a7424fc438aa35e4d423b
a2e9980ec557656d248823fc4366c7fa0f8edb24
7b65855389c4be45c90bfb866eddc9451a8e1d9b
16d2a8ea03bd62fbce4078450c714bab9625175d
3fd6ffb00ebd98f4e93fe0e8db7a8c4121a6c670
46667fae98f6c8b5ac627d4e0ab717413c9abb08
31515bd149e609f6f676bb357d461d6e83a01608
373b3b573a04bc6dfa83cab99bd9d881e799f741
a4dff281c4621b70e411a6013293396a1b673c70
aeb39781690a8641f1164d35fe1651f1fbfe355c
07639d4e4af2b8232ad4835ca890f2c7e1ad7414
9c97ea3d520064dde2bd147946e9181b3145dcc2
dd45f9e65664bc3f4bf324e6bfbd5053f4d72e99
5b6ff83b93434abffcc48d57b1b716d5194cb2a2
bf8e7fc878dd464ca797d2eea74dad58332261ca
3f3bb7416475875a443b77aa98f7f4886458c207
73ed951374c89b5aacc089e88710118f4fdfc203
e2c2b6d70dcad60da704a37e9800948dbbe469e2
9cf083098084c9e450154138455c57cc2843952f
2687815c353e29a9251ff41bdf334757d5376daf
d72d5a8a07999ad84d0a1197db00e979b588f054
22cab0ab976068d4b49ecd7d4fa02e65bea4849a
10c95ab999173de41a257a626d3cd89017b52b1f
a1d693a7da90ba8eaaca8134f36260485f2f051c
9243cade3cdb3c1cbbe77a3ca0a46ef8cc593d47
dfcc241369d1b0f5abbbc163493bfbd3273bbc66
6258abfd7c1817492550798d663e3e5a5c3a54c8
247eb3fbb0690de397e3283df37eeee8dd53a6ea
2b6ee47fc7611438ab7f2b0584cce3cf086ca6f4
20c240e9c512c3d4966f0f7ca4142b80e8de896f
9c57c6f953bed6e9348cd47ab06a132357ddf573
db071da5fc4d62ffcb9e97ab8b5ed4a040c01de7
c43e91b217077be43e04f48a2d014d096f274d59
19c08a7c0a935506b65ae130bb5c1edb214cfbbf
4c4110991857ec7ecbf5f1ce0280d3057b4ed9c7
f595b16e67adcf5278e9bdcec065422cbe5c9b4b
0f60305db7c4f3476af529ea7b778540e06a9958
51efbde55b88dcd80688a6055608daa5fdb30a27
e7e33f0ca3224bab3d75b40cdce93d3da36ccac6
ed99fde349f38f1f1f5250ff4d9a02faecab9c3b
b3f1701f70ea9a610e81a4bc08fa5e1ff3ac9a93
220ec7f1827267091059abd467b88137e717ad94
81a951367ee99d623c35d9ecad79e57cc24869c0
52a4b5eb30342d16b5272d769b033ad90cd4d196
8976863ab2f8aee31a6222a0010e62d9b08a3be2
2ebaca3cb6894916c37e7746e7f9b4c95473cbe0
e3673ab836946e34bc759df32499a89bad460878
5387bc1373db5438e5a06c0c81b80ab717398163
aa88b8fc61ed0bac537901196b0a7b7fedc79ad4
1693e7fa706fe6c8bb414712ace18f90b86c3585
662ef335d84401bb58c2cefcd88b41533e359a1d
2c71440a60bee65291c6a88981857eb86279d958
3525c446bb0056b05fe6745085ead8ba106403af
02e128e74c941b83c3f8c1aea14c1387070c1393
0b27f18583f624ac932f8d5cbabbd3b5407efd9f
595544e72ea35d3e85034389459821b27716520a
8697661b71b53e5dbf4e7e3755f3d6daea35248a
2d69d1b3639238a9082d9dd1befe7b3b97fa8ad5
fc41bcee84c9a43fc507116dd63d8b62dae7fdb2
ab07be7a8d96b82155c8447d5e73bb7df8c9e6a3
333d72ebbc833e2b2424cc63a0d19b23be9cc3c7
0d97d8d35d0cb44c8ff2444964967acfbab8aaf3
b6c1ba5ef380ab555007b98c54c5af03309c1042
b89473a34ba4911150e72d636e7660763c6eb62d
d9039e6c980daefce4e5e3e1acd81fc74864283c
963a62c8dd0f0dea807bd2ecd041cab385e54daa
fd2a050cb03bc8a496075f26ae7a8659739b4647
69e29d707000c0414c64ee0b96530628364f0cc8
dc31e424924c5e02936096bb158b6ac210979f68
f73c6e8e4228f1009aa4820521ca638945e9bd20
62485dd6238c815d2714729fac136dc37a7770b9
b5d6c624ae39a2fe49d4107dd05af163936b4d35
61ed44cd0573769b198807e232ebc005561d62a9
2227edd47210f18a730d6a9abefa8256e09b996c
79c5b318678348c4e3b3fa7b19f0f784b334f0e1
3f31a4e61a2aa5e1cca17471bff1073f5652a649
d4e7eaa96c7270a12b833c6d7430db5f1cd69405
0aba1d2e1c1885f67df744297f296f8fa1d41202
ebea34b830e20160c547ee399b0a89a42528354d
97e1f9bdee0f277a10348208ced3c5ecc52fe030
5292d8fdc00d79026d1ce6e3a08245308f8d60d5
d26de7235ab9db2370396b262cdb604814aafde9
a2296b5a2bde683ee4d11558e583777fb3e24f23
514a3ed75f3c8497c6dc15550d1f25ccf79c1734
1a9f29175a7be590bf6e9af55961cfc1450b3f62
8f9a792030bebbd18185c86bacafb1e134b34841
02fc3dc6e85b78e87f8262532ce8dde6c10cdcba
035535dd27f4661db5b130576828a4dae9246175
863138e4529b0176a20a2927a33ee1bc9ddde4f0
3f30c92abead39a75bb0ffcc3b4adf424ceaa792
5a18865fbce5cfd9dab6db8e86aa0fd75782af5d
50d4d13b68096b45d1b76b3ced4f18701da68a56
8618f4f292ecf3547c230744dbd0b5c73192a2c7
a2579b15708e02c1acdf28bc929754b58d9bd41c
041c87f228eca59819fc9af856d9982f38c4e973
78d23b58a76940d8f58e6af1550344598110572b
f04ecbdf9d38ad1d9b796bb56a3cbf981f7da4fe
0c7c05ff628c54f8b8fecb0c9b807f92905ded70
cde7d17a518207871133990e4427e2ebe3afb2de
c16d04c234423f448de65f8a1825658e9d1544de
19090e57612572aa6007c4ea1e1c752e38ac0fa8
a8055bd9aef058d810836fe24e73e8fe6d8527e2
d4ed38deb180211c1f6744691a7147a77e63adfd
df155e9611f1b685c31e895a17117f098f8b64d8
963356453cdded1169f9c4adbf5effa8a16caff4
9f5c7c72eaab5cf9ddb0cead7dca609e60423f3d
46777afc96ba104bcfffddd7a1406a3c21a80f39
1d29383b9c8f4c77ed93584b183ba8c1a314c155
bda4091c8e359bfc3d2ca5f613eac84e37385f05
16824e42f60e3c2d21e0bc3f81a7244b42a75e06
af8797fd57a4b341a53644df2f04785175a8096e
70ab6bea7b72e633ebb43fb979da2ffef6640830
461d7f7677ad4aaa411cbc66d88b7729a05f8b5b
52282aff92f1992955beef6fa70417b9b09410c3
0f337cd8c71673748cfc3272cf5f457053458b47
0c7714a4f95ac3f8981d44e526e35200e8512425
f76634964bd6d89dabac201afc71c392db27d5ae
f68f44037b0ced445391958b21e1d862112aae80
6c89858eeaafb8a03f709613572ee28a48ff0032
73e05ee0f38d2f206cd60de6c84a8593371d3e0b
2612c8303932ff5a8fafad624f39ad220e65e72e
d0f03270c6429c25f275af3baf0680f4dc69aa10
8b643f37be453043787bc55b33f1c648a9274fcc
586cc5d9e7aebfef68491efcdd2d2621ae8b6b4f
f4a320d63763ef5598ad98eb5f9a4da8648736a5
e2a8fa552f782c6dfe955ffd66bc3576c55d72d8
c95f0c44e4c765d890aec8214205e51820224161
acd96690acb1d5298b429816a5ddf2aa5ad7b8ea
96f140127d8092590d12f6a0f0474779b780ae44
deef4bcbe3f9b1ffdb112370672b49a29a34f6af
35ddd3d327dff18a151fcdb52767fddd27e9736f
0121f1cb99c979c68027b16660ccca25a9acc43b
37aaa51a4282e6843a16f560ee3cae2333564562
7ee0942d174d95cb9acf7aca092a883c43fc6cdd
c5bb21e63eecd953a2585a0874f447a43d760aec
06f03f513ada2fad54be0a113646e44146bb982d
5cc24e46160f96401ed15304bb893a10fef3ceae
ee98cfaa069f12ca4469caeaea2301c10537df5b
cb0805ff8bb419be0862283bf395e10eadb32792
accaa33ba8bde121822be1af560944207b1c1c39
947ce453dd787b1d398e5935f768abb3034ba42b
fa64ad6c012d104c56280cfb9799297a7884fca4
7c7385b77478d340b548fe63613efb6e0dbafdc2
3259ebdc73fe4256876a2d0652bdcd0ae186629c
5c76eeb103ca9ee1627db466461f7d428c5763d0
1b1add09d1e189297a0198fd0189b0a505616106
03976c746507769e95416b888af101e01d8a3361
c949e68309974eec224f3709667ab2e73d2edf80
a129fb2eb5e4099d82d15e92ba1f83db88606ee7
07d2fd16487913f7174e0e7d2e626f50121c344c
f7f14a6b4c8f1bdba9975f6da08e88385185c229
885cb512a28f28cf7a9bfbaa294398bfab2044ed
c67c821d22016544fd0cb52111314ce64e9020a0
d720a5ed18a74aa50c1e53eb486b8b62ac36c713
9069634da8b9b8f0aa037702d4ec0394458ded10
86645a3177b6281d66e1b4e35e1811b52338c11c
678dd84fab164bc2c7b31437ba1a98a982d50aee
e05fdf5204a0b9955e4d8f1ed38fab19a2c8b1d9
5622efa5487a31dce38ca45e71ff7208bba67778
c250876b72f02c2288d02ae211d5c0b7920bf981
dd215cc504ee085a031aac6577c81ad8ae753a7f
e391260463b04eeaed6769f316c95ff9088b3a43
a37c39557a4ba52f53f4e83454a363bd778f1a3f
34de2c54dcb4b73865783cc24ca0b96969b1e87e
25b99e1b211e78ecb9ed20cb803594b1959b3000
5c7816d4ae274af72fadf354bffe70319e4bacdc
f43cae7dfbb13d56ea9a8c3d1d816b2e4fe1cfc9
330d69481ece2323d04de2ac8f5b496e503f24cc
b6e233d04a02cfbee6e25e62d8f033510b08e527
cd5df131c230e5f47b03dd5a93bcfc9d0b17b019
cb2428d137a134aff9dbb3bc8a61b9bde38d8f36
3b91672c6c9c1357190caf3369545b5150fad649
3f5074c9b8147552ec8e1592d74df60c9e46a50e
2aed9209cbce02686c61aca1c580907f2b174df4
b5de18522aa45387382973031ce9c4861cbc8422
06bbc86f9ac496d95efd98bca3d26a7089d56c94
c49afc5cca89af0112ce7bcc046a993e37363552
e73013afd487afb3ea4b564fc29f101d9412d629
601657baf95fe3ce7884389bb00695bf7bb4330b
3657bfd59850a0b74e2a94c53c72348513abcf50
31359590de49b8f5098a8568432929555645689e
9fab8dbf3eee065837301bec528982ffc32c6089
b3873d2aad6a8a8d58f65a369499771db8162013
e4defd9cd3b98b19fd9b2a50c95559a37d26765f
65b76a75e8c8a28560f096d3ae61df52aae053ca
87b771ec8ea8ec5fcbf08c24fcbf2c34ae76db9f
698ab1c7481fad6fedeaa698dcc4d7b00deea0bc
d57d36e0580f4dc5dc69536825fd7f26dfe9b77d
8cf4a51e31112475d0e67fe0ff6faa555f59e71a
f33d6146ddd5dbb8fd4a5f5555aa430788c85c72
806831ba03e3a5265bed7022d3d723751c2c6eac
1ee4502f9b109ca2c06d030c1ec12c1b733348a4
e1523407df5d05d6019b36faac922ca53fc603e5
682677ce50baefea11903b0c868a4f5efedbefb2
1d22d38baeffde8996987d5fe2a6fbf91ad3a4b9
33dc11da36ed72996df70997833e5510e7b45c87
2f1aca8ae2ee142d3bb185c204ee5c64b52033ea
a958ecfae0c0277bd5b9755e6dacdc480a98d652
7e3ae78ed13627dc420cac7016921ec85d4aa947
3d9118d7f619649dd6cbfedf510fc94cc8365ac3
51d6bafff4fc1e0cbbb8e2f55efcc959da4722a3
53dbbfe3e7d9e264e3706f3a76bd668b6995f805
606d7460776dbc264fa3822396f8ea47dd628e36
52ecf3ad8b0875477bca362c855c22776df30a8b
47c2b4bf8e54fa56e329a878ad13e001eb83d6dc
0e4d9929cfcf243a29b0d0da63cffaaf250fe891
159f5320f9466298e66caccb5b483ef6e5055b77
958e418f8a950b1ed20d690b8309262d05827a01
c7deab623214aa39432e4ef483be4e1b5b578dbf
40e8d85965c90166eafb4425f2159949a2e764ed
29d156221015801c663e86e15c3923c768d62caf
cbae76acf8e8549ce8b510ee9e5bf10b9665dce8
3916bd328bf72d08f372edb7f79a0d6958cc4f6a
211cb4b9731b40e36b51c4f1e29b0b5491e280ad
adc817e32355e6f5339c35c0c83dd521cb0ad9c8
4db9e48d53dc3b098158a30c418a65ce1d095c24
0fcecf8474d694bbd425388b62c67925786c472d
cc096b110266d6a71ced8a3b27ba3ad9589147d8
0e8a5f3c97049b8e101820d33c521215e46c9d28
e71a9384f9d3b9cb5dcb280655a1fe1c86badb8e
14dd6be9cd21681f23d8ef63bb77805b24df71e0
e8668ea90a39405a3518b3a02071ad1f94ae6476
b617dfc5df3a6d6a93ecafb79fbd1291295392b7
2f52ca511ff7f9de4ae3aa2142fe55997c1c3b16
9c184a81ef4d7110ed1f013765fc58306b646fcf
466caaad9e55c4d3887389203f37935fa9e2e74f
2c57eaa22af0449cd931b6c2aaa28226f6eeb5dc
63704b7f57b5225a072d58f2dc84b00cec2f9f6e
af0745134f8e9d7efa14ff0cbff2bf05e76bb7c5
371bbf536cbd2982f2f25647e885b061a71b662a
877e46d801a3a6f47a1cb04231ec22a251c1d05d
0208e6faccfd390c8948c344869d283bd0612369
43a3d3db002f3040cb7d4807d65cb4b157ed563e
6e2961f62120e0784b352802f032a7e023a41705
ab88f69fa9fd45e21854fae16956f47b474595c2
6117350ddcd962e464318e8757399155507cb48f
291097a63daf3743365e8a53cdf56e2077802cd8
883ff5e6ba4d94da068e855ce1fc0f309ea7f382
d1c0d7f6556cff41c5ef4dc99ce5502a5e48fe7e
8114297a1d628d8f277dbc21f05e5861c1be9e72
03fb8aece5a640dc3db4b69e79b0d7413a0aa4db
246a128be0e5e83a193dc73b8be1400867ceeca4
8e5192baf3c5772c63bb4ddabebd4a1231950409
e1d46db6f7bed641bdcbd127e18e5c4c796afb65
20fcdf84403bab2f83ccca2b7b059b4c5f838764
73be03970380f6b4ee6bed206672290f2f700f13
49f7abb47ecc6f5799be16aa057c7382bbbdd1cb
9f09554d741c879c37b50561ff4610a635328d17
4d1ca93260487e72f2c9767892e100fcc780127f
62b3f81321d59bc796f2203a349415e54395ec2a
1165c6fcf796434b5924a747527a9d31e3e2513f
4f31943f01eec31d76c18352c3c8da5059d50184
465acc71768d23ed3f544ede236cd8fa8d107cc7
4d67b831ad017435924be58ae4b91d34bc302ab1
9c69fc7899a019d48f63185b1aa1a1aa3cfe36e6
ad576c81c8872ae8f3e2c913bf1a7aa89f2be46f
792ee6d70184c078a4d0e7eb7a5759daffde9575
a726868f2a0352dd69509f29b228753f066bf0b4
d9f9802ae6c4fe2f0e81b3bb033d53c948dc44e1
bad988b5fc9f0656ef94d7f60547b15349f925d7
82c2cc261fc2899d674cae1faf4c3b3f9ee4482f
a6e0d1325b70c263ef61bac6480a5724cda69d63
e122a48ff42eb16f07d1e4c60fa5e798c137c133
a57a7d284d6b29d26d661fdcb2fb5a568a3d6399
bc080a6a5218483c333d8a8d62ad3c9f42effc8a
8ffa9ff5428a7e90f5946ab178517578cd5dbe7f
013ef8b186632b8e625a7f70a688291e4fd93204
a297703456ffe8ec046d25411f087d303ee8527b
ef54273ce5a79fc9fa4f268c67f647be21854a6a
3c19fec781e2176b5135ee5f082c43008f47bdef
efc63d151901fdcb6dcccca38c723091ed3670e5
c03761dd6db163fdac549c68dc765f2b1b2de134
11c48611038c211b9272a39eb1a558beb257ae2a
15a7af2fdbe19138fc1d279301322941d72df051
50e4a4832f60cb11953440d6ab5cc318ba6c292f
71c67854aaf9634bb00d3f0cabf04faa45b1703d
726439a19dd7ea4ae87b185e68bcfd348cf8fdc5
a7db2e9b74cc69f9862d3216d2c857ebaf57dc14
f126871d033c243282abc4e572d68f52a6987d8a
f2b2a9202d15e047129f223bfd1046c240f172d0
eeac604c28012dd95c83af6d9164fed333f5c587
6deb85b4571275288851976ec031caac1101dc3d
c1ea635a6606e7800f03813ead94aa660f9d374f
e244a66db7c5f9bdad8697c4af31e9f33126bcac
470fbe91ac813f08980a9603b4b3a6d77a903825
901af97eb7a61588afcb32a7747c167c6736295f
b734fc096d4e3d6534a21f67b053b4491d67513b
67d5925d3dedfb92935a3983010dfba6286ea636
7143eb17c6c1cc9c78c7b6600f30452f921f7f8c
eefe02ba547f850e9da5c56892a9ac45cfbb29c4
a6d7a717a154ae35ae26baaa396978d3d7ba4a68
b59ada6025e875ea781d2b0f07cd2cab114543d1
9948823743a42effcd85c3ae147daa1d9d15d31d
4bcdc842c6a4645265230b921ced574dbe15588f
cfc1cf6ebf8f8bf9f534b2d640af4d4564213467
5a493fc61cb370b5c2c0c2487aa18f8ca81ef067
14fa0a028a6568cc9c660893502917fb960f93d7
cd8dbc26b3cd8def1aa00e8391bbaf18c01530b1
3aa8587aae55ce50f5389923521388a467d2a7ea
91d038e332e1b38799eb7b5e594d4fb7e93675f7
62dc6be4fc038b2526ccfdd2e9a31e424652571e
817a8062a283827aa22d90a8d5aaa201310effac
c2027be6c0363d6a0011bb6df9948ba734021921
fcd9ef8c7d66d8b2af645be760aa0f99a3c3cbac
fe4e90763318d06f134b4093e7fec2f9dfd74dcf
efa8d3fb5a9c3c28325df28cfe4244711020be28
a4875920e015c40c97023e103cdfa28b21282e37
0a1b04837ef6f9793989fc65d48bad9c7df94bea
f55a391d94e4da8c5eaf3ffeeab3a2e27ad6adc9
fe9218330241deaf90871bbdef5a671634bce81e
2c2a83c592a934a35346e5dd9467fa8c4820dc60
df92443f24256ca322a777b2e39623a4373fb681
c4cd5ad10f765a8afc4f33e31fbf919c765507ec
5c507275ea83d7164daedc690b3f8c8879b21e83
0f44d04cf565cc434ad0d76e7a48e41e882acd5a
50ffb4ad4a36804c57a6897a101a9d4a937104d4
91ed94f3e7ba639bcbbd97ee5319416bd64890d4
750a611301607ec8613ffa1e07ce863362a27570
b183b1e717e37c7243b99ec18b8d697aa8b0a1fc
c13ff8da9d0e6d04c5f530a992501fd1ff3c3992
a5eac062f964e5485f309248e295d8f0110b2dd7
224322a9885f4b5b452d96bfc68a226ca0a02bd3
a0824bac4caeee87b7f21e22d362f29c9dc8843a
6fcc6255f4eb63135e4c714d65638c524f8278bc
dda982bfbd1c8a2f3879197c08b04775eb95be82
3db8d9052c1a7e486657de0b16945b9e2f6cec2b
2d57dbb72c691d6b333499718de50c954ff8acca
b1e0868ef0edb473718fdfc8494ea0e3fe54722c
41529c00be9ed9586eec0e9407c83cff258c0c8e
c88b214251333b7350b10b27fa2dae683ef3b602
c7bb17fc14cbbc27ac46b7ee34dd8287301a76db
5defb56428352d12eb1a9ff27755c37cf9c7cac2
a92d2e3aa03be1a7bc634f5ba71e085a8a48fe89
3988878bb233c3354cb4f3b3aef7d30c73afc465
586cfb543c7062b0df0d0c5bec468af01cf7fa53
643c07c7d544ad83df7bb855cd90aab8651adbb1
17f31180eeac77b4377c5a854bd40ad613e01210
4dee94abce5cf59e8a14f54a57dd64ee480aab01
9298bd4d47c9210c8ed8c353d14fc4d06e9b9744
ea4bc9f5aa3517aea230ab662dde65592ec5a0a2
50b50a73de61b9c6d6482b1baa15c6b8b8483baf
d2c8da09ff1faa9d405d24c9798c41711cecf996
3f6b43155a0af4c5dacf7e493eae2c49caeac858
d9f60de3ad0efb4241b060fb174227ec8700f90f
df0dcf4dcdd6bcf3f573c3d6dcc9eae9db6b9bb5
4eb68a4fc61ea3b88fa0c3361393e240b12a1e71
74a3b0670179ce95695a9969fd1fb549de988f0f
9e74d60fb0df2a1b90fd16109e14c1309a2743b7
2ce8f4bea06100605980b80b424e62e988ae1088
a72dd21df0278f8c70539083ae28dfa1b1fb93e2
9ce9add4478a6fcb0f4c328ef1424c02fcf082ad
6d3f5e2e1b6fc5ac57c411d4adb91691b9e96ef6
a60d94f60fd7a9fa869ef1aa4101338e2e982938
41adfd261f7f4544d0a982a5c09cddf455afa97b
9a8c7cb2648822d9247d083f80a352f337ff70e0
d8c506a48ab502f34b44bd173e6e9b836764d6b3
bc4884df2a3ad22b2ed32eb044b66ab298ad4ffc
1e1f55b0670ea5b1d03a4d9ac56610bf2845bf4c
ed8786a06b8623938d82c9a1c38982b36df11139
096c9254dc09665a7f9645281306c25fe9ba257b
d4747c96ab72b8f2766b5797080d9917363a753f
97f71a42a0a32e1c93904327ac8c195feabde1ec
f2eded53fd2b0e9e03af1deb658f0d1315c90f99
eee1276a68eb23b3df81a8f8f0ec0f5ba293ee2e
807b1a2ef9913086bd2eb27aee47b17d872be14b
2f960dfd6dda36d6154656d1ee439abfa44db357
05983fa408408f5f0d5ec0541db5c61c28a55b8c
6ed938930ea697c7ed89332b610fd4b057da66d4
74f3517bc57aade400a68b128da983acf4b0c11a
6a0ca8f77b62006bbd58a5d6ff0897e3c24ee99c
9e487891682a7f7b00211139e64e069e146e8736
de5c873f83ac38efb8b9ba0f5b9a0c6109d3178b
6939b1cdbfb0c98d611fefbaa935462dddeabea7
ab513ab3a8c9e9e74e0aee9e404b33c6cbad8cd9
3c6a47ce1599c071b84814e64cc22bfe70f4e74a
a5498c61858525d9781dfbe7c3dea27194ef0b04
8531cbfd4662a25a66a14e73c4f914adeb71145c
3111739f6130a87ac9c379617732a3ae040b590f
0da71dd8bf4cd3919d035f1039baedbd228f684e
56a77e02cec99cd19a00e54e9eddea62040af0cf
b47ec8a86d55548b785676fd1ba431386b4e4dae
fcd85f373341fd8421801364e362acd30ef2ebe4
a0dd65902d3535e222b9a259744401f54df2c95e
550c842e6a2e45e1eb3493c65aeec3fc3977bb0b
6585ed0b8a888855de07660cbd45e5ddbffde34e
a2355994144a5319aaba781c68ccec9cc1341b61
35bd7a2206f730e73e49b74b623d115e5be330bc
fa4ae601d9472a0d7fe9e0d45529ec6f56c28147
40a3da0adf309c1f7831f10abcd512275771a9ca
0469c1961ed0b19ba46027db7d537446a9ba2fca
8d6defe515f156e06444884592426c62871ac95f
e0d1cb3accc65ccf3f0279e576eabb2ab4712e84
76f93a93638bbb8fb8bc0e5c0a714b0f01e480bd
c1007d77f7c4539a299657fbefc14b5a87d527a1
b0d6fac4b564797f4f356f9dc81372df9c61e92f
4d74524706b5b3ee9765518a616079174e10f017
edd4cbca59a1c748928ab7ee81b8caeccc628e8d
7e905c1c721018cd7a0336d2b630ed273fe9b6b3
91b08445116f6b25b51ee1fcd1d27d262e0a5309
7c99508394adb92cb499e62312db871e21a09fc6
bde414d405a8051901fddf90415cb91f82a444da
73fb41db8345debc967eb50dcf1f1c461a9ac499
ecc3f8ca6dc41d000495851de0631b1cc64ce344
04094157b805103337eaca75891ce1121c63cb44
05e699c9f4bc2a91241038e16b80b426320d005a
43300c6e1639679564a12f7aafdb577edfcc20da
2490692a8f8b5913d529a81a70f5f05e11871085
4d31a7f92e1ad98f3309708dc23194c9c001d3b3
d270313ca80adfae3b66015a59a40eb65c3bf498
5eebed34cd7055bece9fb0bd46c7689c1927dcf0
f8d363e6e24e942988aaa48a6fcdbf092a65f936
1a93a8d468627bddba6244aa27a210ded5fe232a
2b647fd576e2c58129686b480b5b32f76f9c0a2d
dec8a4c87057cc31951b297e0796bfea37751e17
7ec9412c035ffda8374d701956805021f8ba1bd0
22d40857924ef8d7a4e0e61c9e527891500d3d7c
1dfaa1f43594c6139c2ffcfe76c33af85e596e5d
91cb29f477cb92b35ee77870445f225c798a1cde
fd2fd068e5b3d537ccc027d1c14330660cd4a030
b7d2c765ff46acd6c9df645f97b9b181715257d2
18e679561335e0fdf259c8c21b664724ebc03e84
d2b0eb4eafdef691e71691cf6c1da85ac07b9fd9
f6137cc2fc34a4ae334c710c0c237c8f089d7e20
aea0913b894ef74d3935df3ff3198ccb86dc89e6
d3d4628ac44663d42115e68c3195cc57cf48d4c7
dcb2af1cdd32868cc3c900defddea926bb85be0f
786ff9b649a0a9d6f836c4eda390165034573d44
403543b8e778f048dbef3238e38ddca4707b38a2
82f0cbe7e117718aaf97860090bc01edfd939a93
cce099319717c5fa6335cedab8512035b0d2e6b1
f0b772396303c122ef9ebaad2b4c17d34f15f2b2
428b1d2c2324fda6afd6ad43f3d0ff697350ae9f
47cc12a4f06fb26c611be63bf340624cc80e955b
c59f76096c9ade54041cdfc8d4319683ddf1f133
5e4b7f22a106a7562cdfc6328ac6349b6eaa317f
77d625cf97b5d206a64809153a85ae6052c1797a
d131a82d6ade3c8f05713f7445b9452826d25d72
3971a4df0b2e68e7826c8850edfa74d0678c2120
83e79d97322144cadd49e99c4d568455c00e3fd7
4b037caa02962d80745655b5e1ef6858ad04ea2b
0bd4654bb6b58218dff7e1a437c38f23860c17f1
e0d64dcc93e0fad10bd2f47c62c4b2a39fdee7ad
eea03615c43deaad5bdf2989e4dbf4dc6209575c
f0adeca772448524d7e14aecece343a4a22fb36a
a15d049d16a32896d73267da550d8f2826518526
42dbd37b3d0ebdf11991af51142ce4938d4bce99
c8756c929ccce9793a1e1717439a257c97f22203
edfe59b7a42884380acc1344d17663000f75eff2
5d739ba1d7f82408c41d858329ff9234f1ccd439
6513f4410cb8923286d35492d48458efd5eb1d22
7ffc2a2a3d8727cfec8d298e85a81a5c3fb57bcb
2bdd089bffb74d6c25e5f171748d16ebaea7c200
af9dbcda856289029402349ed003efbe0f10e95e
6a82177b68c97bf88752b5dfb6ecf85d9abbd100
b1dd12b4f0a9d8727d561a1a6b3395ae9c684211
e04b046b75d3a0a31e7eebbcf30e36f10edb55e2
e665ba2b11285ecac9ee987fd1bc4a1ab6b68978
b2da46c1581c79c6d176dacf7d17f622d36e7b23
4c8d56dffb72abe22830054d8936f750578f91b2
702cf8a46262a9eb2e4848faaa34697cfa83bd52
8ce7b4dab224dd31a175f1284cae93b91204eab0
743d40d88ffc853de5daef780fcb8297222a7d54
ae30e7972b8a261a7ce0d4f1a9d908e5547bf70d
2cfc720178153e19c8d537a5aa8ea2cdab0975f9
1d43d2ec96bfefb7132cb6b236dcf8ca06f6a09c
07d8e0f85b48c54ca8da920ec3153fcf02ff7a17
740e37bc645b340a2093c85114b1dcf00c7d5057
7afa13f6302b3793a7ad04bb492f031c84d80f55
ad06c1cfaa2de146df9dab483f00fb43a2295f6b
e7a573fa5ae649a379a6385557a42a7112ef095e
c8f1c13f26238b9ce8ff5fe9b161210ba70ed48e
7e9de543000ce6b6633b33eec1d82d6854f3dee7
c3b788bdc8b2f59208a0c1f9f74cedd3513a75b0
b666e3fa075ea5245a6aa43d9cbfe1007097c340
6afb800cba67485ac08beb712307b45ea95b64c7
2c8dd08c247cb459e0803564e21a8dc5841ed9d9
257d9be36a877688a002ee68473ba0fdcf47ea12
1a6cddb03a08c61e26b2dd32b9773e020b8f589a
09313aa08dc8cccc7f27e03d5f6e6661d5e2b73d
5697532b99955d48dd8bdc38db85b86616bcd781
c2d3945ca539d59fb3533774c99718ed8529c121
a3a3fc5a7e4b658806e0bba562e6b703cf0f25f7
6880c7142972aabcdb864fc48a786478ffb8be49
1fb03173971da31cdc9a60cf8f8823cfe0eb6a4d
46d70a337e287f93b05db5d9bf57c08eaa41e535
b9ce7647ba8f7e4d49f8824ca24b7914c1ef4404
3e78e39922364d8022190c8e188e07744e35b8ff
00900d28e831b38c5dc78aa3d66b2a4938d0d3a8
32d04837b45a8d15a6d0ef3fba608383f4a67197
e562ab294d1654152a4b8bad1e64590212d6e26d
9997109f3b7c7d397b5af4203765da6d582f9e83
2eebe2e8e8fa3dd9924d95bcf2725f4f58146337
156950f559f1c3cfc05cf1b69396fd39fc4343bc
b1bd959c9dd83b36c94f1fe2ae7ddf038e58f8ca
fae5015141acbff318d770f2dfa73f031c5fcbf8
2d32a49fe117828144eb2f0503429b7c411816eb
2b9d82e43ce6c4d1bc50d1a7f90b6657c2549633
61a20614269616a9a3f212eee62c988a6e98d531
75a875d51968f5c1e13ad65ab41e67da6e979c72
8bb17331350a9111b5aca33e0869177d47562ed2
87811202be34c5202ee3525cb5c2fda1c06f9d28
daa6bbd9c0543d2687d9d5166f1a8b0b1c29ecc8
4456d9b0414e7458bfa977830d14b32a312de50d
c2cab69eadc89cacaef04837c068830abf219cd1
7ac6f555eb29477b3cb60d39f576ecceaf35859d
42a866d4c75503843b0a7471d1f3ec6c4065b1d8
ff11825a7e043d30879b81b6e9436ad248e068ef
36db3ecf92117d20a83581c018e83c09b89ef3a7
3b15194e64db505f314e1e6f980eca588fb1aafd
6f6d1ea3a0b3bb1089e59b710357e83abd331287
b534497026ee08ca01f7a3d15c4fde24376cdb4a
2e8a0fd7cdea999ae4e90f9f1db1bf36aad95e00
00fc1334ea6dcb933d56e9231a98f97b6976afa4
f8d704d99cce7f00696f0aa9ca6272fb7f04c005
c469f0ba9886092a80dcb7b317a0fceecd9ce82d
0c20533d57f9a7b501c48a7e7d91b046a4cf1454
107f39e5db77df3f782b1a45d233e4f2b028dc2c
3bc03c149ff90926257ff722f82ef9bdcdd16d20
a1dd9044d6dc834354326a1cb23d30e018f7921e
a1f1377d8f50f44d6635b3eec779da2aa53ee279
b8916a7cb5330c098b9d207305bd75656c98bc95
c190908d01f3d219cc55add4d95d5416eaa7b332
c394864619651a0fd186f0d12d520a25a669e3bb
a35858ff9118b1e851b49132eea9581d532537da
8ebf5fba21f99bf904f38569e3bda3306ae8fa9e
75d76e36326e649ff354d6848dd07b34f8456dd9
fa1964b57de7a486694a979d393625c4224ae34c
f79dc044b38d7cb50bedc6c8ab5860d0c6c361eb
6204fdb79d99d8a6ec90185d14fffb2ec624693b
c6640ff2ecf78225565be2778b9447bad0415571
c855821012ed71159c14759768f173a0fa754495
9da93ccdb5043c45a03ea9efab26d69dda6df426
e3cf3de293dbf4361f384539ef9248b495464953
5929359151b00d7eda040110ab236d2a529137b8
8667c490c5f269cc10e1574e24ba940c7016630e
ed9162b21b4851a8443c2fc9e4f86f24da57f536
309020346d1d02532ba6479eb38c5b46fcbe1422
13996bebd47fe648fb374aae3517c6e8ae828478
a711d7e9597a015d2fed25a7a0bd10df04bdc9ab
20cbff25f55c0a305e3ef1528d785c581988e7d5
886179285c09f239edbd573b620257fcad3f3c01
8ea6bb8ccc48d688e73d0ef614f33ee28d0c8a77
b168f8ede2ed17483fa46c52baec81acdcbdbca5
63647ef1e00134c14307c65d29b2539d482607a3
f653ce88a5fe3c38de000f0287eb44023067ab6c
cd6fb18aa0d9c911a71e02a430555f4fb27a9bfd
756b12c6da7d180b2b09d9be3f8873bc93774366
1c534efabbce6c81be33b28a2fce4bab307fee70
fb3226afbb6a91e96b04670d362cc18192fa70d4
93a1ed46a904cf3f15fb12cc75fe4cf8c3d8ecf9
259f64c4abff05757940c5cef61e152f7296d451
a3df4ce4e01a93797428ecaa5ffd14e8ccfe6d4f
a87041465ba90930947920b9075673ec7884e0cf
a2af37311be5ad693a7d76f859f157095eaa6e4b
eb706a5a3ac8bf004d015a9de54ada8f7063a3fb
f42eb0e6477757d050c07be2adec952672eaa083
f22b141b1ad277f14c0e3dcad9506275a024d985
58cd4786f055db39c15980bf0574f3415e49bd4f
880278affeb5729cb5f860903337bca3e53eb5f7
17b35aea596261032c6183327689184e52515363
eb82e5ab73697559cdaa5359ce2eb664d2fabe14
e55ab3e4eb8ea9a798c761bdf31e3428759cce2e
d887aa56a5c40c44f67735af585696fdc624a6f5
d87203edbf363e7e64eb4af1adfc1403d7e93bd9
f90689cc8579169b4705ba603dad1cda5b427ced
2014b89f5c3911f4b37bdde167e713217fe9ebd9
de65083142747932c726e75b451791b50eae56c8
b22bf3ddef855c9ccd95430cbfaae3099d44540a
1648791889665b29540d093f2cc38f4ef6a87ff9
fc0dc02dde3ff3dcdd62d95edcdfeb44e2348f4a
ee97002db899a95857307e328775d2db7064e399
414109b4d53ef973361d5ceaefade981d1b43eed
763485c1819485fd5455cd53814a7a5293870a2f
b0380ce7373a8053058e1dcc3bc436e241bc3717
6bcb68bb0c651266c30f0e9962f2eec80c771b5c
b40709212a5dc2820ae9b737a584f291bdd29669
2dc2a5bd7646b376e9cad23f4f5db917d4068adc
08e71702a2601e75310cebcb95faa5194ba549d3
171513f9e25c57b52492b481999681db7e0997ba
a14098100a655d494e48b4e847bb70f4d13d6476
efd9e88fcf3e19f1ef43ff5879d9c742572b1a47
b60953ebe93c0577e2ee2ea292301ecf0a090aee
c3faeda237dc394ece62a71cf701930ff5ff6e9f
8be2229d5c810a3152573c1a5c5d0c6f93021eb2
7f5bd28b10d793afb822d01fa2ed8bca6f78b697
c92d4688407e0173c8e6ad66369a8f15e8400587
870d44939d3046d8b79f0bd59f5e6d1cda31e97f
9b3e2cbbd9010213a9e2205408594031807d3eb5
8111636d42d431e521ffbcc8511f61cacef3be00
9247eaefdfee193b8766945c6cd2377d48637c2a
cdbf7233f95ebf0034c664574e5b4afe45209567
7c7bd555e3dc8e056f90de9b2175959b3443f482
993a7605687b42aa7c36987e121b70b3e6c6afd3
83d90093a9f5e63379de1bcca145c51bf8618483
3534c6ea4bdd91ece5dbc71b85155bf07f9e4cdd
396c062ec0629ed16a30c714463422979ad83202
f4008680a09bb4faeb340deaa9b81cdd09ec7216
56b3c8974e36565744ffdb592fed64811bbae82d
c0c3444708304739612bab676095883c823ef96b
755e1e7bd6bd44f358588a248e038826672944a9
5ac8de10cb3f1fef840d9d2acbe0ecce293712ee
0c974de72660d7e8ebbcc3f7ce495199837bcd26
87c55ef12898069dec92fe13ee704dfac649f33d
6fe68a149f51a757953ca35bcf08591f8a349f67
cad9957616e80eb216a8269ad552c105da553861
51ebf27bd815180fe84a7813b4f7160d63e09abd
9ff4531b0227acd84946a6ebd4f40928036442b2
045c47dc9118fb22a20579c908d071342d3be8ca
1b24a410cd70e3c1a09130db33b66ecdc123524c
6312d09c44a26d0cd989ea283200bdf11bf985bd
936c72146ac85c3a490de4c3441084c4d403ae29
3e8f145578cf290075c710ce46dcdcafabb88898
e4618758b9f80847d459dd053b6c5b60a26bb580
0842d2135ade287427a82842735f404d09b807dd
73c0c257d966bae0c310dcd841fb37d997df9483
dce6af8d9c49166c1619fc762874ef274fc36913
2442d0d467e47af0e62e1a55059a242b2789ff3c
c45597efaa5fa9ad6a98deca8c1b9f4ba0c7b388
f5e2d7155ff1f7d69f9d32fb02fc00c728ca0534
565bf63ac62792464caaeaf7fef7e12e6ee55424
e7a5f4f11da1b0219626e642c4183311b745ee3b
8d5d0bb12e5cd91db0edf18448c5704b5639d4f8
55f8ec2471c4df074ee237fe1ec5adbba32db24a
843b6e0db426bacbf21994b137d27fffdc13222d
f979796b0c2a29a5e77e6c72dd933cc922a3a610
0b0a6abd67a44d8f3a219e9794ca9fb5dd9c3679
34e4ff3b7f27b17a0e7b6c0cdbb53bd68e012ea1
eddbd60d7351d594c8f56e46a09f7e878424d9eb
8336f450225b1088a02a40c62c6de74818681040
ed0782b28b6c89069bd919709e1cf57222bc734e
2d510c904fe14aa029ee9ea96e98f3aadb9a27a9
309d520d70d01ca5cb2911bb2b51889ee265f1dd
1ef917eb3b5c3674142c40c8d9c83a2542a097ee
3d4490f29327d1eb634369b349edaece42972c6f
625d0d43defef73588a349fe4c9ae4c4b5b513ef
371c4ea6c98df00752e0e43ad40c2017c94596b1
de96347a51d1259827a7feb556d702629363225a
3559b7e68f7f1ed0c0977ca4dde00c5ba84295a6
eb6d3af6e64c3bcb5e358f3f690aa1e2e68bce4a
7943f39c2d5d2fe4b4b0e693ab16e1efcc15df14
e408ca867b6a5af7cdd9804b1adc42a7fc0b428e
c7d4923d98be9c4a4b9fed8d8e22d72c99a8a66d
8a2eb618c88996ce96f2b9651945086a9911987b
15d9cb64ccb64e28c7a8a31e8c70d7b11bb8ca45
06a2374ea824885faeb8423146f78977e585c921
d752b7dadc3e93935c4473643ac459501855f69f
32f6c5185b7017a86944ab21ed861f3cda67ead2
763f35552506f642325d124def537b738dade694
e17357b54f0392ae5559328fd404a1c02ad3373f
494fc460f3533bca4e81fbb3cac52f381f0169ce
353887e5360d94ce4ff5a0a891814aa2f03c1be0
f673d614f9955d79b613eb248288d317349c5777
2e7acf4fe904c02ec796c6e8aebe73aa4364c073
b6f4f1481ed3a36c3d6ae02cbca9a2877ddf6702
e892735488702df24d6bc4d9b6847e5c13c57caa
c23f6f166ea3ee2e3a9c659b5e1763edc823420c
5c2c32cf69b65865957b495122ea3252a1b74715
8319ce82acb079246cb64d185d99835bf195a11c
a7b5433d897630789f687d9504b1d58cfaadb6ba
68f9b1f66a6579f058026aac150edf7d260c1e1b
fa306ebbebfe90ed57cecbf5d170a5670efc2151
a77115c64ec17be4382284d7e7da7ceffd81b796
7c7e1cf85df43725857ab626818bb4f464a5fbed
ba0abf4fe1b23978a2479d2e47d38777e88fe8da
5c9045fce266d3460c68c8a91db8c0bae73928d4
213dadb37638d3907b081787817dd0bd29c7801d
5dac9a380d67d645ef6ee855bc8db7bb2fa240f4
56aadb779fa63e3751a4fe096fbf0f6fe0b8c6ff
380777056cadabb8b2088bc504764f6f5a988e3a
f8e12884d2b5b749d7f004a76bff484938ae9949
ff9cfc9e20b5804ed54ffac937af1c1d923c4b52
11f42d1ca38c9a24d8c86d1e6f3b4f5697b62a50
8cd24935a6a68bc5da3f95ed7b8098c639b286a8
44db64adf744fca1005aaad64cb679c8e46480b9
07a29500e828892fd6f9f3bd32791daa93523c33
00d60f84e5beb610ad2d414caa16071ee8318c20
9e6165884c69419cc706edbe695ee44bf594201c
db85442c55b983a53acf28b630c26156f5c78a7a
a39c1523d84b91a9fb2153966c01f40545d263a9
e4c32ffe5e1ae60996f08362524f0a31e156e580
53f6940f23637c92e9b3c7f2590489f1a04fee8b
a31a5aab83265cae124030e31afb2d8161517a49
4e66d02f7be46804f4291e52a2913dca11398bb4
d9c9a4e85c250fdfc52889e313e88bab93361a67
3d427e156f02e5ae80971c5adedab736e4570218
2817457d03d14b9b8c919d14a4398ad11a9724f2
cf8d21c1423bee2d235b7d2997fb08b13cb2576c
461216e738dfa7790d86d0bf5fa32a94f22f6b30
6fb37dafdc35a91ac066c8b82598db9a565c5c6a
dcda7bacf833e3388f96f369bc8e1a713cfff943
6b7441318d53089d8178c5fd92d47b625836c38c
ed1d68e393d336f3860968921d17a19c080f82ef
5165fdbdf164623a319c97df2d3a1dda239bc350
edcd5b42498f1658c88938b38d66ef23b3e997b0
a8f51d584f6de535a545173d2e714c34c9f057d5
921ad20d8c0baebf6ad19398fca666347e17305b
44fe70810398f30422f01c23f0b4d5119e5ac269
04d3d7dbe9aa5b49e4e6edcabaa73de93a99007b
eed48aadbcb3a0099d6339b16d0ca256efd5b2eb
77f487b70306be50873167a363b7cbc455ac7a1e
bdc2997ed709155a166218a613f78877bc8adf99
e5f2cd20edad11523f89f70fb5a9a0bbe976e220
c8f7d9b4118bae93328cd9937a42cf078e12c989
3255032cd4fa5aaa8339ae3307fcc40e2c1e5526
fcb9686346d364b4d16eb7bebaebef1c9bbee05b
453da82b53c59342919230bb97ac103e7d19f5ca
5df0b5ada91bead8b0c1ce43133ce31bb988721d
0c92eda77ba173040b0a35da9232869f02e23b31
c7f3890d56ca343518535df5254586262c26ca14
f3622aab4b6f207b1ce84f7997dc3650f3f50a4e
ee463965c59f9fd8f31c162345be3784dd08ae92
0616d64521ad05f27ec02c43467f4246d20439d3
97fe92ebc2bba8e18fdf11834703cd25a9889e55
8cc732379d61f12545214351227b96d33e81d6c8
0817c9ad7c76c8dc9f6c04a5b64230ceac788eb8
daab25528053c5430942d3734593046b09c0735a
6a30501a6e9356518a6d47951b7d201ae7462c00
fa8222a169bfa56c56addb8cfb8e2782a0b291c1
609550397bb6bde78991a8eea0701a9380113af6
3d47aeae457dcaf92ed21b63d134359ed50e1af3
f3543191335117632af7ee612dc7b1f5e65f92ba
9dfa4e37ad094fb0c2076e0d03f547700c9a2250
c6ca8da2268aeb7471a4a7e7ecb0a91b6c1403f7
a2ea8cd20379fda7bde5886f59498235de34ad2d
cbd26d3ca965a86c1ca286e0291ea0b7cd6faf31
ce8adf1b5273038f21dfc5dd8b7b74249e395a95
3dc44779f8e0875e678ea03c20e17c9d445024ad
6237b951c3b52feae6841d91aa8e10a25f583921
b8346484331f3344c4b5c1f9caa75cdc542861e2
03adc3156bd16c5fcdbb83619bc0770524930361
3cb41569351838ab46ff9f533d06d9b4ae3d89fc
f01c855e592c9851b9c55d7db90b5969fd426868
57395c0f477f7c865266322d3556c7583a5e72a6
8aa1830a3e65eb9e093a055d59110c69094d6242
9f19dcce147e3b82ba5d8a3fea49332c13503366
746ec4c40b56b3f5cf26d83e5c1bc11a4f21359b
3c1c4292af8ec1c90c5b070aa9048bd430f1844b
a59a27bda0a5ba38bc4221b9e7855319e7ab36c1
09bf9da137d19cbb57e15cdece55bff490238364
f9afd41bcdc50468b2b12333789f3ecaa598443c
0835acd461d8403200f1dcbdc6840146651d3dc5
0bc8459a29b18b69b630ff293e1b5cbdfe240353
0d81ecee5c630442421dd4bef7825de9841e189e
392844aa937cc2abb498a179debd22f8b48b8072
92f73f2a4e887e1a18c4fbbf58e6e29f0672990e
9d43e76dd04598dff4e2d90dc086ce1126c75a8f
94d678fd6d46196d9c35a0eef6ba84ae9b794b5b
1c49f296e9184f7e2bcbfada9de19d2dca8d315f
0434d161c35d7fd70eb1a28a9376fdd55e8af2ea
4922aad478a5f06bdacec005c741dd4fef76a13f
a490a980257e7fbd63b67accfbecfaeab2ee6150
c1200780b220e4b1793e392ef033325e1feb371c
a725efdb0090b911f25c5d59c2c80fc2fc4e71f5
09aa41c30a0f6f4f22f4f10680ddb540acfbe892
f4f8ab64127207693ac48d3ff6cf3ddfdfa41aea
8f68f34dfaffc9a8f17f12472a5e5fb8581e5219
96a104220f748e43a43efd15249e1ee2fe932144
cda111f1c8a28c8abdc93ce2843b2c5193173b89
10d61b696779138984cd6393a3de536d90c4102e
60cebcc2a64b4b9bd3e80cbdeffc0b8ffa6ddd24
0b6851cee7a0aca9664ec2f09091514374cdd819
2b7aedc107c5b7e8cf17d71e96ee760f6d0b38f3
663bc588faa0d3c7773adc1d841bee6379b9d46f
60f17c1538c2db3020056e6ef23c76456f738b90
55e5e7ea66be6e2f2b0a2f98e6ea78312ba3dc1c
922f88419d1403bc1e08e30b49070594081ce187
08da76f6d09eb31073cc12c71bca1f645a66cec3
a56861ee45b5ff1b1d90fff3f905785ba6484a9e
2a5e280ea37fdb94fcc120d03369b5ede10e128d
d1aa338f6885a69c3e695e3cb3efe83d62caaa09
6ba9817c4b49b3d3d5624d8f28026b4ff4a2cddd
39f04ba4cee1077a03d713be74b12e1d72040060
e215925241dd1e34b67b1cc5f948096769ac2ada
3486102b7ce136fe13d4fcaeba2e8af2b9a15e63
115df31ed442fdc46f586ad953306fa5ae3d375e
060b00fc8acc7fc52e3b6d944e5b306170393850
5069e7ddda117ad784c8124d6d29081ab8ad53a4
6598db3e26ae44c4ac858e846963c4a24c209dfa
b39e2701253246c1ddbb41a7c4ace9bdbf88c587
cf978ec560f604e6d9e2ac00c94af68ab8321620
8973ac89c3fbb08f72f46fd6785bcdd3f4cac8dd
b30a139ad0c87fb0f02c90f29481f40f12ca808b
db3bc54cf0fee96e609fd94e8714f02a064a91b7
f3353970df8f5514290769b898a9368d369b7f4a
af41bfe6cb1e93304b43a2b806ce9de97d0a3677
1fbcbd0f6fbf67d8f84918621833e1d6e63de439
20933ae40f783684e90147b154933d86028867f5
9441c946a1b67c621e7647c0bf93c3ecbfc2ad38
3ff193d807dfd3b4511a567bcaa5db5ccf717d39
ff658fa38a9f9e038357decb831e35181656b0a7
bc5465e7b036b3f8b15200103f8006ba54207617
5928ca15b6f45e8fafd468d09000c4da765b3267
65afd1f6e7515175ba2ecd3b6d86e34c39a3a143
7d1c22dc0e55a181f232f58d52ac0adca49f856c
12b76eb311777c6b1671e6f475b40205d7b804b2
a721002c199cc70bc0c18557cba3e8c537d6744b
2642451f9b3d61c5bc1f9a247f38cc695e043ff4
3717ad63180779f1f3119ce38b8b29c0b637c827
cf20c150ef0acb3c2c61b4a8fbe6015c8a924ea9
584eb58f48b8ce5365a92c75407db692001878db
7555cb78caca688287a315ac3ae44e92e2717488
0f214bed7a7cb4fce58819d54234dc67538f897a
1c7454dac153ab89baec68da1e74cdff26a5e476
59181b7efd513109142736c54594559c20b99759
7132baa5bd7686de6190e63dcd538aa0392db08a
e2070fe65954daff51a8bc6839b499b3eef6bbe4
ac1a77631ec67159ddffc6009e23606b1803d9f1
75b3dfb19728dbe76654eb4f633bae7a2dcafe85
7fa9cee31dd7c3cad756282f7ff64ea8d120c2fa
1e65dda2670080e312ad1553169b1d3ea4976632
9a87f3a42bb3f2456840d4d98a9dd51d2e3418f4
1e7644e62946bf52d247663ff2514226fde46138
9a6f944d187ce553b84ee511d1ea936e1770d6e9
aadc0547f85cc28ac730b88b809d8b6b58d99f13
3e99df7b4ccc1fd40a5739257186ea24ac292c4e
916b4adc6c3af117a9a7992b872d6b95047adc63
cf311b3f8941a68b155e4190c2f00a5fbd5f53fa
ed16d248270e4aa1a5cab2af65b009c685ee1c65
050b95e0f8ad833d5233a6691bea89b6fc6168dd
638fcacb4433104acaf7d59b0c29a34a9f063681
79e0aa07c41d4f4c94d80184af13f9f8fbbd89a2
5fd7d73cb7ab0f751e5ecddce95d0f85bcb30bb0
a95423bc1dfb8763f4d702e9e15995e2634a44dc
33477e607dfcbe3d005b919de124af3ae1b7701c
a3cb688818101f47ef7adc65e0a5aa189c89cf3d
85494ea42dba92740cad9829b0231e303a5db0d9
89da2706398db81653a1a5b6509e6c0ec990cc6d
c72fda263ead57ae45ccf2eb28ab1ce92962bced
765375ae09d8e3cc08b8c389ec856f75f1f7ba4d
61c5967288d6a33d938d769c02d25f68d9ba4926
ca7f16cd52c720561b40ccdd6beec26f88cbbe5e
f23b864a3cb3d5526a99a2d75ca3a69ac795bd3d
76f8d5f07325ef4942885103453f986ea3782f14
ce8acb42553ccf7eb76360b5f65ce778bd6d099f
fe9ffc06953ccbe5c65ec134efd7070dbf6310f9
62c0b4fae5e8b9cc366a7de5d3b349d0fc263065
9c1b112fbb2b12dfca47b63646b77af1eaecea8e
ac1ebe0c86d4bb1b5d21db0eb29e1313defa8f41
8a7f7ba79856092d3d1202eb41ed585cd294cc52
aea234264abda28edee90db41d92dd6df1dfcc6b
148e79032178755f8fbd7dd6dd15840ae02e96fa
9019969a7522958aab1a4bbc30140a5f1f5df983
6ceb6692fc981af823fe43e16e59a6fa1410a398
f15008333f58a883ef8e5caa27ef99bca6de1611
ec07d7c56028a9076dd834a835a76ebcaf570d94
d97d0cbaa0ca851eec37585bea0e5357e4d6544e
289886ee032f60c41fee15f3b5bba6e671e327e9
f5cc37a37fc4b71a37dacdb993ce07b0e0c2ef79
d6fb1c05de68b63a38282b87d220cb5736d07fcb
bfc9a572d9ad25e1755002f8d03b31edf7b5fc9b
6b70420a51f716b3ab5842db978d551dfef88434
393344f5571828dc6e58888245f3718035bdcae3
d5ecbcd2b61f92b5cc10a863f6e95ed8b0b96898
ff2a454b25c17ebbd4428ea41992bfdd71096fba
98046aaaea3c7c203fe80e1c8d2f61618ba7b63e
667b9288e5ee41e2e7cfcf2d4fb7a428503c549f
cd06d7a2a94f1abbf466516694c2cfe2149bf56d
b7178b68ba8542d149578874d7fbd5290786ffb4
fd2328046e3788c440fa48192a63dbbbc1c79264
dd099c2ff2f187389bd5ed69a5a6e462490c2c86
28f686349a9d05b79cf399468027ad5936a20bc1
9e4033dba0d8728cc8de62cd453027b01af2020e
16a8b5a62341f818a591d178760850fc8bd283a0
588cb3c20dfa3ec6ed041cfce7aa391e37b75f16
5d1fbdfde5a0296973a89f90794e14985e89386a
344be156abed478f0065bef75c3be54679183204
8a878d60cfed669c02afb1eda3d0f6cc8c9d4948
5aab7b87b93d0326fb5e15630ce01aee03c30741
42c6aea2f3ca18499804d48de4bcb70023f37a72
74223b3c883d1f7aa53469454f0a1c5e3e5681f5
47f956b156d70d77dd477dc8e92aa99b4858d4dc
bb15224b49be4422bac517b6e18f6aa410ee2571
5d0b75705955ed383f676fe3bb4dc966cecd8583
f29f670b6a9d4454d42679475c05d5933084344c
0aeb7ee3f572865c6ed1d00cb7d94830ee435fef
2daab6b71f884cccd363b6b05a19293cb3fee2b2
602ad423fccd8eb6d7f4ebd297fbc68cd2b08d01
983eee72f935a7ce70d28a7b6d35e6c263fc2fdf
085797c33219df01c930dbe27c29cb11398f03d3
ef332f0ee789177c64c847302f1725cc42d558ec
0695cd31a90572587772fbc3f45dac8d678c8c4e
33815785d90440d319fb6efb7866118f310fd419
21a43c9900c59302cbce48fd2b0d8bf34469cc7c
bc7d7326829a388463a5a7e41c99c7801269d2ad
cce8539090b295ca6ae86ca7a0900960354798c9
9c0fd79d14bdf43cbc69f752624d30e586e9564e
f501053662ee2c79336012b5cf3eeb86539bbadd
b879fa2bdc4a4388efc07e8c9e3f4004abe15e98
79318e3ef70daf15dad5b620857efa857b2066ed
f8e012438b1cb25abbcc2ff90caf8ebc2ce14ada
2ec4f03b7976b65d99845fbc0950379a9f6b5a59
13a73ea3062ca6e8977b6257dc0a0e80e9ff0d2f
dbb03ebac0d3391ecb09345d7cf45ddc509104ff
7535484f98c0098f8358cbdb3d7a82834272f566
ae3d0c71561ce754a77e4b958de94cb494c17ba7
6475fee6ea6534f2e5641a56510bb36256951327
89cbb67300162eea463f9ac40cf533eed2caa6aa
ca0d3756116e607ea96d3165151f590dbf605d4a
c81cc5897f336db0c8889c06af72db2b3bca30e7
1b983f297226e77b2800630ad2335da42ba976f3
3596c39c740ef83457b75261b774a48894c4420a
22d83a156b253fc2f203a2e08d0538a7241675cc
41d9b947ac9c7c7a2bf53d488b84c31ff436953f
79621819717360f647e693c07704ba1d7c30b16c
e7d0e8562eb97199081bb7b9f84c68e218d0b557
b5ebe5ff4f5d9a1e2f5158ee99e1d2bd08f0582f
b02dbcb157172a3c6ccd5eadfb2a78477557799a
6098b9f4d04820329d615ec01f8332748132a6de
dab249698fd794f5c70475ec326165f2733107a6
7e0faf08240b1026784dab219fc93fbfc88ddab9
5caadc2dd4f99cdb4055f94e82247ac7b4644c82
eeae319e6fba19122867592373a6cf625ead92a0
151d86f75adc877b7d11cc35540cc848fce6d4a2
54b9e6b4096e25aa496d37571a8528afc7f6d586
c3d0d364edf4d383ff904e23008821396e3cbf28
202ecb65234c571f146226d3c8421f7ec53011b1
8f4e543faab2ba15f0609321876286d3d98149b5
b7e8dff20e515cb91bcc486e3573714d5f53e68b
d5258fa6c34c0b4d238f6f9c484495b07e42bc70
d1f5701490e421feacd1f2f83526c343524a126e
16ba0130857f157b8ca2d25ca970628b2d6e81b6
b876bb46ad10a9e6b835dbf8017e36716fe566e9
b286809dea53c2a2ea82ffec535bd4519f5c9e8a
61f9af2883329b93f18c7878535f9f97a6b9461c
003a349e1cd36f53ee8c76d0aa7f451b14d09fff
725ceeb3a0a11c0395f58b8524db7a5dc482f3b1
b36d14fb3160a67bef18ef1e98f81822d9f97ebe
04439585a81b86bc2b6efa84ed95c22ed6b4aa2b
817cdea62dfacc1a2b26d76a5585473bdbdf80b2
a67b89861bdcd4e46669fddaf9c9e7c4447a7c75
2fe18f670331c8858287495c2440c218a480eaf4
70fe86b3691b34c50faf1aa9d78f0d7bd29826f4
176580d083e975678c1cb0204af07ec1f4d1e377
2031fbe4e584fd9ff239912990afb64bd8465206
60e2fdab00f8f20d4204e4822909fbf15f2b80a9
ace41e37436366b3b48f28150875d1da8683f971
c190e513d8762ca6cbd34203d4e7f34409718350
dbe86a1d276ffe751749d78b7644bf53d727b235
92f54bd32c64650744622d29e7639e8495298709
974cede9e228fb9f90ea1f02b56762ca3e343a6a
1c5f9ef05f2ac1df72a2c2790e0ce4a85196f899
ad56241386f50a1853c92bd6bc9de657d460e228
ea5e2e2a8a5282c92355f12c5c12210eeb7993d6
14c551b7293d696bfdcafd1c662291f094a1bfaf
25fc05cbf29e3dd7978c5c3ff98c2af837fe6393
44dd4bdf4e26c1dd93494f1aff23a31f1f7a9e79
09821b0afdefd29f0a2d8f1d16d07bfbf4993d65
b190587fe5a11c9bd30338dca34d8ffc5a3cb9a5
5b3223187d5d3c66ba4ac176a28d9d445af3a05d
30711d7e9e349183490fb405f8309d463dfe75c5
466d3cbed9a7de0143d2c409e39e477c2c437665
87ffe7fe3b93ee0a27d4d22c89869325573a7386
a825793487ed70e3969d94660ddf17905edd3d78
127fb5fea981bda64d6d17c298789f1187fcecfd
63814bd3e27245dcfc5d4ba11f765c6ecd727838
2461fc8fd838e233301fd6268c73e227ea812483
39a8cbf850140154611de7842acbe94da5ebf3d5
23b0452d3f57e7e1f1a04e9b65ac79ebf45fe94c
63a6cedf489fe45966aa661ba42ef14cfb50af7f
8861b4b932ea90f9ed891893eecfd4b6e360ad32
e47c3301943a66984671a3fc238fc8d2c48804d7
b5551d43be75252f3f08d9ba1984be8af9b0161b
ca51e56e4fad9d83d97dd625061a726c6737a127
cb77b48b62a1149bbf016cacb19529328700942e
e0cb8ca5c167da59831038ac75b1896648b844ad
56ed04546303de03c403ca658c16909edea8e265
2ebbf629ddc5fbe7141f961c7a5d819a62d5f194
f5ed526604dda2ea27d924e008fb8822a40b3b40
68dbc78ea23bc3c094df7de434fb829cf5f71291
d7ae04bc83484c23119be8595a4b02dc8fca604d
747a95f491ea34c7e070d8f277b1385df9e4e233
1e46a6d9596d8f7b37f5fe4b532c45bd534d9341
042000aa2f4103516b675429826aae27ee630cff
063cf906081d3894fb0dbe20e2233075d290b259
9e1a6b9565e264379026199507a5f12e9b18d244
8805ecf84743bc0cfeae3becde69e9b930a41bbc
90b4ac84b052fd1eb963ae9ef179de54d17b9339
20bb8fad54023738be95050b43c584376eb38547
c764685364cda45cd7f76ee61026fa92b3435e32
7be3b97d5edc74d655caee605512830105737e9b
6e258008f3fe925994e072daaa9d75c9dbb7760a
c7ff8ae6f595b6655eac2bb180b6eb7eb157445a
ab13610276804818c8fc149180fbfe5f4529dbe4
dabb36bfa7ea0d68ad7f36e2d15a3f603ad86ac9
66f3b4e7aa86a9192c64fe6d1122ae5a29339b9f
a0d919e4c908cc6ac5720f4b147ed8733ebe9608
a7c1280523780c351501ca0e25bd897de61c81a6
16e58ef3a16052bdcc77f8f7379dbfa8ce60571a
66d404c23738071205eba79bf92da94c49f8618d
29721571915c3304053c2a6564255d40fcb09e5f
fc6564b7b42dcdc3b00384909c4b21ef8fcb3993
a28988b075950add016891cb1c0d76f28dfbeb21
3d083afdf332473516db6956c822b751574d059b
539c024c671d37fa48ab31cbb977af73913825aa
8be239fc61a6cba28bea5190d8885e1d1e25b598
69e69bd2d6d42ded7df8e31e78581df9167d35ef
018693e7ebd8c5cb202964177d5de298de356ec9
2373ea2a423fbf98ce4dd0c556bf1c7797ad14b2
6e9f2b2e48b22d581ba1f26630c7f442e9ae5f82
2358e58442d261aa832a397f09f62d71ad1c9771
9a156aa2b8e8249e65999f5b08f81d6fe4ca53e2
6290ec80b465320bbd966c90f4bbc38a55a7bc76
dab065f980de93e5d53e031a1cb95a980b90b814
9bc941fa9f3270a5c8db6bad9574f30482f2fc10
aa092df23f44030cc5996d6ccd8df0cffe4e8cfe
3160ab71dadf831e17091cc7215dd9f90d7d96af
92811fc87431326cb07f661db5d9ef72d9ce4e9a
3320d2b23e9e9d8b31d199dbb83c87351a1325a0
a23762fe4157e4cae2715b063624ebb9be06a450
a0a5a63f38340dce64acae8f23ef26ed1e247064
4e035bebb3622c07f57e392da8c6f2afaebc3261
22b1a37803ecbb339f016f881f26bbbe5f2f8c46
c312d8fb2f94a0f765ef40a7085da271ad8f3601
e83477e70105080f6daa89859888b9c788b64831
c40947ea2137dd384adb22367ddf1831d293df15
5625d5f865c3760152f1ec90a35d57c22fdf0c0a
3e39fd2ac22d59097105e019c60ef1998508dd7d
dd0049686de8b640ca1123d4dc8f4194021ee887
af1c60e897334324e3d6dd1a7787d50d2e1ee973
a3f8c6157c4263813331935a2635df856de10c27
7b2da29bd66fec284a8ae0ed6e7c1fb58d8a75e5
126d16e9a6419ebc946d76283549d48edf8f577a
6c2a6d5e2a602bca0e066a4338820cf2520300e5
b2500941ec0845017e78a79b376305197de374c1
53d909fc90bed86c508e9602dd3dff0998a87fb4
95673cb589c08f7b9b91f0565161fee9b89d252b
283bec8c2dd843bd9f89e4fea6ee6e001877c803
8ba974019ac339517ab15b654cccd3c9882d3d34
77635a5a66d8aaf180316c16152ba6aa245f8996
6dd381f8cd69e953a5598a0c26a1088649507964
80760c1ddc981f6e94f4e3dba1c98ac109806232
e045ec2409c0502e9b049e5566d5dbaf7d6d8788
69bd7624b90d527ed23406b956ec43dc451ccadf
c371d7af384e8716ef3e0be02e2f8da6551e84dd
041abb29901cd235202e0f22755b7db6b2596932
0c2b2794dc45b2566c1baa8b061bd60be3530cbe
aaedb6a45fa3f154aefdd12b68ca3b10daa45d26
3dfd12b73b4c30337f0f007ba299b6c550667f52
4a02d86bc5c0cb808bf8b8962fea0425521d3977
eb6c2b821e0f03e4976a073124f91c3025ca2d06
7859611f7fe33530e181b48b558af5827a4022dd
e6ab0944d595e85ca3bdb683b42def15d7fa4ddc
c1955b27adfa21f3ae38b54178c69cb604e73ced
53ba73e1220feab3a4e6b54265338051fa7c9f91
60594ed03141479578c6a07d11b5bf76753dece0
038b5e5b1e4e9bb1e6f7d8d7969ce07279d474ec
eafa71ff350fe9a4cc5b2ef66fa38117bfe094f7
a370bcdbeace0ae48d100a2fcd2801bd4085126c
0739c358539a0629bfcb26a661610748909efea1
8c110668e59f3566b16296b91ea496f20aeecb18
aac8b80f73e9b221e7dc4370aefe2e43a16df286
b935064fa71c603cf65127440c336fef96683426
8cc818b9927be4dc0091eb9b93d86477d6c62c00
cc507c7d912a95f3f01b43188b422a6f268454e7
e4886f3453e9cdb71203ee66f2487d60ca4203ed
1c6203c29dfa8ad426e201dfdd19c09b21fdc834
260133601bf69ecf226350be74a5fbfd20c85861
011becafa6b96e37fc37f9944c63a5b4ce2e4af4
4c6e863cdc20372bed0b306a76443541989f04cb
8e3dddd53488518eb2af7aa822408cae39a60ca5
77f8d5efb19a381b5488a846362aff40ece9a3de
5eb05ac1c1e72234a30f04a7f52d4604bc8b6c06
a11b72e26dc9a71430fb3fd5c4bfd5591409906c
e37e821ee0e5e768c60afe17f0ef3959a7136f3f
81023b24f5a899da647ae7ce00669c040592430f
2245c608ed6b13c94406c9d8b64626ab9dfd3d98
77bd401ef2b996e1709999668c2cf3852a691723
2ed683ae1298506449b325df1ef81334f94bc79f
4f8689ee5d22cb18bc88f9d583dc1b083adc0cc1
aa6939f2229a12ef75fe06e5a9476a60fc07f066
902370faf90e28437c058e8dcbba8e54b0c5cadd
f694ac7f54a186bdf9ddc123879c97fcb85e8e3f
ff660123dca05e16b49e4dc31e55e078dc584110
2a605297459206702f8f3a713577961f49d68b18
42be0e853e6e504790761eb655f6028771cee855
e388cae6f1a14f729f86d57ddf430678ac298f43
5762ec24ff2ccd9a5731a5204015d347ef3b1dd9
91e1ea02b1fbf3f0066af5f6161b11298fdf5feb
b0dae40725f2be1ada240392874748c7f8f5ecb1
141dacddf82b531a609d64023e44a0b78db94ad5
90b11bf5c894ecb81c395235ef3b036282c648f6
c0856b90f4271b5e2281a15dad9fc9edbb75452c
9e752dfd6a77d89fef094c0b3b852f1a2e945b82
f6b39da05d9d0c96d73b4b9bb733f70c5a892c1c
f8b22d9a12a9cc43e70086231388c4bff00a9b77
a95d1faa9b969ffe0dbcc8033e3c0da37840560d
33433486d2acc9e1aa4dee8c39e2478a2a5596f7
e3c410eb88521e5453d127fae15cb4ef8e98e3b6
5aed2da88eef6ca84b46e16f5085b77bfbcb98bb
ed285c33d2b968def5bd3e3e8445d294fa24f244
c9aee0b1847dbc71fdaaa33be01e7d3a65c5408f
c4dbb41e7b37e9e0fed01bf48eb4c4698bd6456a
b7c8216d1611dddd849b19920d1407fe68f3a7e0
30ec734b5ff705a6b7a18dd7cdd6c5ef0ebd5231
4e9375a0ab4f304a1fee44b01d68d9e30cf0c02a
4bf3482f0b7032d8b42df232d85ffaac68d9b0e8
fb3da587b3194dbc450734af89119ad69bda4456
eff9bf8e4c3b1ddc6619b6b6ce74238cce74bffb
d8926c0360032655ffb5bab4cd1fb6f34d9025de
0d3ac2dc82d3d2cbd18381aa7ba3c924114d1650
17e888fb78f4c94277dd9be49b8913966ce80361
92e94b9a2f2a4daa7d6174b2a19156ce5e3242f4
15aeaacc15e86c6fe879d131853c4e2aafd404e2
9b7a09695d8906d7760c4f8a603ee6834639145a
d254d07482d160713f4962ee83b2ab3ab0a061a5
d981beee8af23eb1a88959f273c265893706c36a
0e829d781bc79e9aafaf07112a252d3989d07ae1
59b8313b93e359e2e953f5759cfbee35555fc6f3
a927825f41807b8ba3fe834bb4cdf9b19f380160
956943487a928049235d880e5756392f7b646766
942b24602598af530f0b853e5e99a06786a870bd
203831d712b3691c1b9167048326e433475bef56
b77e88e29d7f10ba18566064095cf43575c7ef33
9665f3c663cae93a060a8d42345493467b2afaf4
75e44d879c72f2d5fe03dcfd1be1730d191c34f1
9241e581a68df76911cb74c0d241cdfb98abb97c
589fd170829697735036d0baa90cdcc2c9461e2c
42d9fb33b7cac00cb0bf98dc91556db5978c07b9
4c46c9c2c6507485b069901b400ff2fbfdeb58a4
058c2fd0fbe424772c4ac8da958b108b149fe665
2779721a299d975eb9b449f9fe7d5b933ad4c541
6dbc1d7982c8727e149a2c026ab1ebe88d4007a5
8b1b20920acf629cadbe99b4b06769e8e63912d9
3c602d135d6f170f910c7893c96487db949637af
ce76652240bca2e369fb7d09cf7d2c90a465e53e
b88fcccee58017d8eca65fca4188a9d8aeef4721
59044ef87ccf8565906b5fd8a1df49a4d450c621
4a42678222549258646340aae4e1cde768f7abc1
13b6151582c0f91a91b3af81a79a5c5b71bdbe82
16dcdaaf7183e24e0244c572f87567afd3ee43b9
513a30c8e55f18e73dae972ce10d9db9563352e8
f59d5160a28f8f4407c2c989f4d41b8b8312b123
3fa8411d14a191f218d4d13edef3d9858bc2e1f4
c6976fc95170d3f8ff7ae5b6ffc261b3a0c8ebbf
e7e5b1a40b91e62a5c4b3407035d6eadde539374
3bf9b70afc3ba297a2e384a431867f5b0ed00e54
ce56e4d5705b73accffbff60048fb92f75b106bd
c04f2724aed299780444fe36da320baf4cd58f6b
eb5d6336b9f7acfbdc5110ada01bfd8946fc4d73
3c014f58a59a8b657652c9c4babd71ff79f3d7c9
457938c59d0867580e96ae978aab47d10424ab2c
83ecc170dca6746831ee32deeaa692ec5d97fa74
793e678e8c54db07602dc70f5d52112e5e186f62
86b349224e745fbd675d56e113138227e0574e9e
4fdcf23e77468179dafa74a2850e0ff0b3cc72b7
9b2c3db2e020b5728ff8047c254b476008f1a4de
bdf63dd83891ea9cddd40d02c2278cc8f4ed009f
84cc1f485cdb313c0e8f2085711f4307bcd931dc
1209735bc4779ed18949ef75074c7f6f2468d51e
f5a18b7cbe4263f45718a257c2a45f574e8af619
82eca5ccc5d8b09ce7ab6fe8ebbd95119fdc9484
ab1d6631e5a193b7ef8902ff2201c4f4618043fa
4d3b1682c6b865b5367ecc13e32b2338e2f15a1e
8b592bcdcb4b112516600b4be426f20558492029
a60b30d533ddff616416883e153ed1d9fec6a26b
91030ad3b9e0b39481dc276fe243e55a7ddc219a
1165bb26023a7b24757c7360657008438ffeed2e
b2e277da3de0961b6717a7cc08bc23aa49de6960
1f767694669f7b7484cf951f7057d05386900a49
778c025c71c48dede13c4da1fe117677a5f9033a
5f93fa3171f93c0edc84806c5924d6361644852b
a1e1a90f319fb0440c6c321e1ecfc6ea37002891
75b8116f0e2c8e32e5a1df7efe04582ac9ce46f3
49a18e01a1dce832861babbd2c15fa2079618389
99ae7d5df176c47c5ea230f8392728cffbe02030
66040b97ed790dc5312dfbc9e8592a35e6910c4e
1583b45b01afe9434db335b92fa314a1e1b32f7f
ed8da72e7c2efe2cab3c103e6e2c2645dc1150c7
15e06f183af7d908ad11e8b946f575d48323ebec
bd863c42a007fb2e991d5312b03ab16fca92efc3
5caf4a6578033a6e34c335b0b9ba6934eb9e0733
c76115212f20709531696572e531d1808d06eaa7
4c8b8da65f27daa006e41869fa6dbcea848134fc
99bed286b6b15f62e27a13e614c00ed6688eab1e
9a98edc95087411000326c3ef635792bf2399b16
2cfd118ad8a498a6a59c04964d85c29d9c3bb99e
5b3805a2715738d8cb999690f3b441c34de25a05
c5dee805da8ec12b2c1cdeb67d371fe61f673ce6
7c3d12fb7a2be0e0fe22e04b9947b299a700fc06
b3e095f30f3b5498926016a3c6825e9982a468eb
921324ddfa980fcc711de28abc906517ee4c40b6
2ecea64d78def7c33892f5cea8d2cf28c6d27108
2593339f116791259429a6ad1cb1e9712bc19310
7dd8a17b8153ac0622ba98c720ea260b30b6b194
1750b693ae732cdf6932c1e1b5d5faf57ed4ad94
cfb00c047adb0dcb0415d1ded819063bc2ea8d3e
93a98ff4aa0a6275db7ce16c01acabfb4968deb3
0d5f2f340ce0326222c34c2d8613ff326ffc2345
099d3584c1f3118b18af460c01fad9f6b432cd32
882de80116bc399a484d6cd6afbfea244c6e3426
6157a28a60dc731c02ac8fb31cc8591c04eb918d
7558d895a2e25800ece0e181ed1b7788e800608b
aedfb0d1ee3b89213984234979f2137b2a59df0b
fa3e1f7bf740445e180fc574fee2a15265d7c08b
9d794dd375b30004efa9c5d0301522ba80ceb6b0
2b15d386650893591c23669c2ecbfb529556d518
73f6fea1d902e7a9abf341dde9d1725b17e854b9
2c9d64d46eee85049b66048fa9eef659d826f9a4
235f903c9b8c4897a03df7bfae30f1bf45ee2f1d
9e596e2ce492b51c134c3dad22a1ba4ca35c3b02
b6f2f27fffabc0b0a28774c450000e24d4567371
7a2199cb5b30f0a8f08a5975aedbb718aae4778c
66c3fe9e2253315cb6b3150eb23f0ac01f99f6b8
960074e6bf4996db7b0c73c908aae5fea252623e
44393a6e59288da83f0611f92e67119cf55b11a4
7048f82452877ded0f3aa5dd6c51dc3c9fe3078c
ba2fb8652c31e34ed00a7b447bbcbca3e17e0dd6
5b4c13a16c7ff45c7f7586ae9c2d0d8a9c1cf454
cada6f3b68096eabc8f62c8a0b6f52f2f2ac181a
906b33da57e3aacd23f255616057dd9da460f7c1
6969d79f6b18b40cc065ffbc52191a5bb8e5f786
20ad3212c883e78ad15895069a6f23b4e5a46ae8
78b6265a9d3e0a2dc89cbf259b0317e8ebe22762
349e61f8d63ac3e021b9181f92e49c7503678f5f
14e6cb436f44a7f265c7ed613a2a9d52d313f056
f7ef55ffd6b038fa002c795613e37a1c040ea732
35388acaaa4b66c8f1347d494ec5e3f38f44a4f2
ddcbba0a2c19a2ae786675ecbf2bb40ffdab3a19
6380ca9f409b6ac30e59fcab658ace2587ab45d4
8322b7b03295246732ec4334f8c66c9073990faa
659de73d00997d6ef6fbe9bace3a4c9939a5df3d
e6ff5cf5cb93dae1a7355a6b495f94bd9c746d55
0bfb0af828d877f5e65004dc3780bda2649e80f6
45dccd21c2191002a5bed33c744a397b895c1b0a
d726380487cef794abd00e00b27d3c535e18d92b
5357705e425b25400ee584bc84d56ede14667eec
a1409c59deb3714ffab1cba0d486cb3ccb2fa51f
013023749f30c305652c61d35ed73d4f58795809
c3f97845900139ba10929105a9c3e8dca34c6672
3f7f2a13de3b202ed48ecce83c8f093bcf421bd9
3d133ee7a6ae25903e1cc01eb8e6a9384b34ac44
4a0337f57b3727affc04511ce9547483986bfb77
3674dc9a515e798d00a84ac4dbf22f7198d9e0ba
cef282028674bf43872059c47c179dd4b0170572
9c8404c23592bc4d5b6d932b55932b981a2f63e9
67148356831d88c45e6879817903e8c24157b96d
f7b184afe38ba624148fd86bc3ab5a4da05bd588
3d275be3ee2013f36441293189b6af4ded7c7a15
0708b729cacfcad3fd4d28b10f228bc1c542af74
ae02588f5a9b9cd669949895c527aee4c70b2774
b6936e2311fa65faf0c3a17393d57f8227581f8d
24306942fc9cc6c9d87fbd8d92be46558af62cb2
3d81b30cf8af7ba01385391d40474159300a46a2
645597d5629e3f45fe86c4e3d053aca3733f5d65
8fcb849ece00cfcddd2c9f605edeff9a64c21ce6
05c43abafeff549ecbd9e53cc35116bcebde1504
6119a97e5eda62f0c9930266736db34df40d9ab5
e6afe014e74faf0727ae620fdff2dd9b2620558f
d824515e08296521080f0715d5b1a2cecab028bf
e84029b031eaabf3e7b428cac52edb1026e05f57
84c26dff4642f9f148a8a4fb3a24d24e4ba4c842
36adeabb0282fa7aa704023be624704aeaa7737e
8c5369e76acb622ae7c9e7b0a9f74a288777ee58
bf65ac599de2482fd4016aba17374dd4365c6ab4
ab0422df0420288dfd62d32b0da5f33abfa95058
1c309d0d097ce264b2c749277e22f6afb96d31fa
f3c5d0af8f533c56483cc2c32dd59e55ef979553
9fe740e810c39f990d8281bc33cf6614d0a12aba
44345eab11a70553e1aa7c8561fe587279df20a6
6a67776c44afc44deeb53558b02a76fdc9c176a4
da8c57e2686d704b3a51357a70176c412816c2f3
d9e62ccce9363a4e36520ddf53c92023c87fab33
838d4db662059e1b0a3dcd9895b33acf606b5d35
1bfdb1e48899bfe083d359d5cf3a1641bde446fa
ec2ffb962fe60b2874cd281f5519ba2226620d88
087b3022cdd7d6fe2fbd47326f9a9bfdde8105ef
3f6dec3f751e3625de3027551713e3a04af0940f
77d4d74989a6cd745cfc20b016fd0cb28515ba1a
6b77313ce0cacfb1dfaf08bbacd804652b763235
515cf15dfc88da8999fa60e018bacf4040f2e64b
a56006401802aa6637d781fcb7216ed8d70d1d00
6e3d80f7d4a3c6ab51e75d07a58944ce16a196f7
e325034ee2f4ed1a4b7929b7a8100cd287d703ff
9ae76d535a2fc2e746b914fbf83dc3b097f2855a
d807063563a63b7451fdbabe27127f786e4b3ad9
f2d8742473a1630d56bea75ac5dff0d01d9afa99
a26aee01aa92ab38bc22e8b71a9262a4b617a821
d317f3ee531139dd11203d344e6bbbf9f4487d39
e4b77fcd3992a422072251bbeae4132848d80216
2d2d33ee45056b4e43d52d731e47bb59f93c1f3f
69c3f84f4636dc56fdec90e2b2ab7dc09ad70a10
871ca3f67956ee0a8911c9378643e4acafdce45f
47c3c0f1ede32fbe67ae4136eee3a9ba20c6adc5
3a0ad942a884c78fc01fa88ca4cb46a58c85064c
fcdff6652036f4ffef6051f1c9454c4527f5e12a
efb20947688a815fd2fe6a80f195486fb12881d2
7dfc66fe597230c70477ab11cfdde39769ee4695
cc9c143fa472cdbd7805fc7f55b30773b67c1bbf
50987ac70b7e56827635bbb7cdf47728d93f630c
28cf51f82d6992312b31bb44b6da8ce0524526d0
20d4b7cf6e1e9985858c4ee2d88980ab01d66808
808b69afc436d118108029034614c19e52b872db
0cf97ee957242a8c63993253b38c6907507b413b
d958c93d8bb186b6bf27b71b215bf5a43162efef
c51b8d173491c8f031d228178411bc7f3c570be9
fbe0b0368dbac3168e3b1344149a36f82bce698d
52e8475c0a63aaf90888339b8fc7c09d33b7d62e
74d5d64ea961bd4e5c7c0fd3cc08af9702960a12
1011dee05818fc5fcde8cbd554c495378333df72
f5c077f3fb4013d56891810f4c6c3a44813d067a
63d466d3429e1c5e022da92b027ac6f972db6c66
97e50e2c965a9f51aad3a29ff0a8d3da9098afb6
cc0e3c88bd89802b937d7e6086a6efe1890fca4d
ed4e3511ad2d7d68dd8dc625c0cf369ee3b860aa
019ed3d873e8befadbddb1f56c43314e9d2cb4f5
c99ae5928fcfa2ea35b455e3f9b3ff95aa80ebe7
4c5061669b68ab639c5c1d541684722e6731e73f
e1b894edb52211d0f28c06e6f1144cac6b55440a
ea91bf399e03c75ad6c87138eea3974bf7eacb1e
4cfca2ca106590bfc26cab6d867d9330393106d1
79fbf8685209d7cd2f796a132a6aa7296106ea65
62e57d310d794ccae30840af16211fefdc7b92cc
a3bcc40ab1ea1243ffda1e621c15fd8d645998f1
97d82365edb7cb1c4169223f6046b9e7a9a7dbc4
e7e33fed434bd06a1c57287865e4187ce9237818
689259043d83b6e3eb598d138adf6bfbcd18f38a
998b0be23813de5e4348296f0728e3eed9e51967
2662c086013f5415753cce2c68e1b1b9af86154c
50434336d76dd930cda3d78b5c783c5fe1fe9247
64e257b489b20a21a51825dc26270887ce65d7dc
8f403c25f510d4214b2b443ab70fda5dcb6e5112
d1079ea98ed68b616e38d0399df138f32c4603e3
6a40809978d10ffa91f7be5d4dba309b99843b5e
083930d4bdcfab64fa0dee2e5dff0f89a0f0cc00
56ebe63e308dad18280e711792b7b3639a445bdc
c6ebcbbe2152f441a7d2144378d44b8c241001a7
55c6d3a8a0bbacbda24099fb569320f0c4e39acd
505160dc6af62806f7b7c413686ed997e77ff93b
610834d41f8405322ab34d03cfe980bdc2a56d84
bdb7edec43840d9dc08ee617189f028a270bae93
e68e584ba418c5666457e1bc32ac203f79f2cc72
cde2c99ed797eca9cc70508049de0de621990375
f4eba5be0915806967fd6e14ed3f2b7e3e43374a
c5fe042405e48e100513c545191cf4a575dd1164
8d4c4f9393dc9f301f81265d86383dd56af1ce7a
84fb9ac5f657b63463d0bafb64cbceefc8f801db
ec2ebaa5bbcba32a227d91376fc372e0dcd51a72
c4f07ecf7334ebc66c2b74942cd8ad19c9b80bc1
6a6244ae5ae66857116546a84c64aa70da9fef2c
e8c3513f99d1f734281c893f2357374893a689d9
b389459485722e58c508fff3829687f038a14d87
eb75eaf1e8f52081d3ffa19737cf1e386a8e9a69
5de2b94560963733af93ea01cfb48fb3587c3817
82d3f51b5a3f6517489599c678f815f19dbee1eb
425983a27b432824a84b090c08b16ee3f2030659
22f15c2097c4b895ebc9ee9edcd69dcf4ed055b1
456b139ff2fdd8227774fd6e49bbf2249873f9ab
cd6fb1e206dc29f01955896415b447752adc9eed
34c97dae0dd8e3c52a4736fef455eb5c221f6bcc
e4176de1db50571fe0704de7ac66ae7b33683391
b63f23f6797f6b07bef9c3080bcc6049785af918
6db1e3b0addf8721c2afa088efe6e07550413f6b
b578812373655cd5ad6afcae139cea32dcb3350e
15452463de0bc35b8cd8ba9602221cebbaf452d2
46854615c9d3487716ee21defc65158fe9139998
6098310670e6198e1dc71da0c19b47402b388f4d
b7026ba379540cd5dbb1cab29b626e7878d69bd0
f95551465323eb8990cddce09f0928a3f20dc9fe
eaedd02a8c38094878bec06cccd5820ced6d729f
20cb405ed58d8ea5797ab611a06589a02ab42472
341f1bb1b6ebd2f9e2a9e5bc80ecb8e924c9a16e
74b14d739ff92554a2106839daddf0acd7aa4e37
7df26ba4d81a09c01aa26660744ff0a011d38086
9fdf5e42cc004a5aa42d57872456c04b94dba276
f9713fb262681100a5b9e99222af4ce02ad87295
658695c588c634cab89ec3a65054f4d89f9af18e
9e637b7c2da277d8629ab68dab753386d116a233
60841ddeb6f74b3691a9969c5f20d28058675287
0c9fb3ef6d12bf27f6c034c929a30e8213caf829
1c0045b2078d2dba2a87185d3665e8666c5b12b5
62a95efd8e94072d5fd7a18448e1973407d144a4
95a067a6f1cbf22c965fe6f015f1946d8247de53
7c533fa92e67bf759c63705f3a2ba38bf17cade2
f60054085f8d8395cbf020a86f5aef13d172b696
067e979aff32592a34afc0daba1d4188ea9046c4
55020672413646463728c5abf4716302161896f9
f282dfac1f383786c9e60c4c43974a0dba9c2a5c
09c22d175e78ea1bb8c08e55fd6b5c23cf798bd7
ce2273f8e4556060f2a349a657ab6e78874b45b9
ba3328fc3e2c5d0fe0aca3ead4d7abe4bcae0520
c7ea4c6bfec6a648a34525726f804cdf018d8cb0
6a21a1dd7725ba3f129d20028e5cd79453eb7f6f
0e82f5cf587a8ca2fac5229af6e1da04fbb3c458
99c76f0bd6098aa3172bdabc7ac0b4210c683d39
82b7b1a39a16fdfdf891096aac36bd6ea7a22849
d68e56df12b70ecf354177549c837deff39a10e4
61a9dccb2b41ea89350d8c9a7e361952207e5d47
cdd0d8a4c465e0abea94f38d4c2cf78326a3845f
05dfa018657d794d8678403fac08f7ac841eba8a
852d06bbf8e641b8090d645d5744335f51ae8e13
d3cf85d9f3ed1f2d51c557097800b01735e058f0
bf9af20b132e0e6c51db41fec889aa501601d9a9
3388a9d66fa6f1f3a6f6528c4b862c82c53c7f5d
1b4f27e33f6f20e60ee1604935509db03caa03e3
42592fea9dbd6d08eecfb82d5b88954ddfe4e31d
66c07ef48148c9a3ac21b1c34b6cee146dce63f4
91b954a9ea9cb06507ac7eead1ff24349000bc1d
210b71f1b902564a4a6d869d9610a580b916c41e
6e1a4b67aea0c2422a412a481bc999aa29352103
225f723393d2840c8de81236bc248ffb9d0bf2ef
c53130200a6ef06497df2296aad1e6c9ed27f292
5050ffda7bc5977df6e071fe881a163387002a74
47dcb3be33f32f85f442300fd434f2cb2b19aa88
b90b65e99ad68133c7b426eeb0972e77b55401d5
a306484ce89e49fc17020e70f1e5485d3d77f07a
a4cd1c7a7b945a9b347e7e7b09518703ad5170cf
ae2bd8ea022973b1d3cf74bffc0e420435aa0084
65d9b412c8e628d5a59d6227f865e171d4d6af02
a17c6206d8f41cfe18d7fdf53c9394f46a2d7549
d9136035e52196f9a9443248085a7aaa2ea07177
a1aa7b630ccb45487d329623e182c7bcc41a8149
cd97478cba66bed7cdb99c7788b29f492acddef3
89aba6b54851b992020db17c3ab237a5d46ee27d
656429533dd95fab33de88f043d0cc6480a4883d
eb68428a3b6993fda4f8570e8e5c1866ab7b6df7
050707569fb1e92d9d90913feca2c5926791fe9f
4280b0277339b2dfc07456f7e8eb95df01825223
3f8df7b2e0f6f44d385e36c9efa955cf1d313a5b
eb2a30656434bd2f8c8689980e595c0662215a14
bec7289e3e52786ebd365ab8dcce90c37535df78
5f8de2d823a05755459bc1ae151f2be58439e757
52d2339f02db3402a12198733055efc0b833cc09
d3e1601c9e5d02c76f65997773a66f69e4c18ac6
0367725739cf98cdf7fd954656b5f0e5f7dc498b
d5555b5a88904146f037b1777b1ccbc3fd585976
df6c9add73dde8126c0ac98cf21ff569c5a602e0
7f9fb2325771005478fbf8c10f487149ac28e895
ac93fb29e458a49f2265b0a146165515df4f971a
ae06eeb651ac5ee3f36554102feb02d605726da5
7cfe90077c726788d79f663143bf1c7dc55d6cb7
d614b77f9c7b1f712cd2e599688dee294a9bee55
61074d151d4dd157290d7e7b0210570807a499be
27c00857bda1ec3dcd1d73d52fed8156be102825
fbf822d73f3a09e9588cf05c1c79e1deb8b03f3e
31f9a5d9a334c0af187ddb8fedf3d6613b029351
8d387c5bc356376b84696ec825e914a8e1eba605
d06c51b6a55177e102e796aca34750d9f042ffea
69831efae2d540363e6685adce5599aeffd17e30
a3d252949c0a867abdcdbc2fbeace5813875d50c
2c7d51a7e874388f3b62f3000b57decc1d906703
08d10e0e628dda014c9fb1331e2b9700096ea2ca
525b1f44557c90cbd98440092fb53321c3c0ff91
fdd79140e22e4802f865460df3a75a0ad50e66b3
210a2ddc4420e829cf6a2d9c135724e05c1219c4
25c9393d1160c74c3681b7588eb4f5391da2b806
25fc7e99bb85bad0970c9d40d3c061c95f4fa04d
32d177564f89e3267d6ee9f88b32128dc6f66435
31dd5677af4d9640a92061f0fdf039adb647994d
ea93010271a1bef8480a93a87ea75e3e068957ea
332c0bb6b79b29fd56a283f6762e72e8133b755b
e12ab1b48d452f1554142b63c5832e7be1058837
3983711e773b9f6b41e4ed6df96f881c66a0586e
2207add74d482c604cf70b68f7e61f72d235a96e
860ab8ee1a68078c7f5d871fd27ac1348e3d47a6
a1b39356ab30428b96f3815adfc6b6592430dca0
f50a31c8df66b3ac8cfb46c5fe8f291db60ebc87
30d36d670bd96ace7dd33132387e01e73750021a
84cafa37fe15f86334ad6c156aaff6b5fdbd196b
14d3c26782a92adf62dc26276f43e3b30839fce0
2b9d89de6ee285b749028ffc6fd2544118ff484c
ce9f450ea71a35b9e08a1b936431d7750c8d0ea3
79823053f92679a78799d946af4f76021e3d4884
c02abd219f4f5eaf295fe0da9b552190c68b62c4
179cae55486547db2fa5efe8101a9820437adc41
92e804b0f004a91c0e47d88b954b8bc1d882998b
17680f44b08e8891659c7bc09bdfe637cf632127
f96c161f8bab289573e1d4a6cf9dc0fbf3212276
25b110bef1346ae693673afaa2a04553faf99952
244bda0fd487d67b3d5e42c2b1b6a9f8e53dae97
194beeaf4cb72efefce02a69c6c48f5e9463419e
bbe0919f659d081ddaf07890b41a56854bd8660d
789683f2bedd0a502e76e19ee2f7dce42023dcae
e39f4cb5aa9266b913b79089b6166a1c586a726d
1fd189ee59969884f6d0872df1aa30d3f39ce5b2
43246b5426badd72a5b2ac690f2d78ca14271666
4556d480be5c0c11d7c91152bbbbe08958b6f02d
3027ebd0011ebac64e8d8665ae5078500c72e921
9e9755bde5835ae4d842741b6b4071b8e1c43799
83936bb0cbfff957a846d55acac27b2a2c1d8cd9
0cb7af60b073f8ecd78beafdb13cc540e90a2a6d
1c9d98e912dcd04069c0fed2d7680153a97dc42b
d0b5c970a246391e175cd1762138a35d35dc74da
f06d26c7ec49e4cb3e44c3f4ce2696562cea8612
0aea024cd5bb0fdfbfc9a757c7a95e53977d27d7
21818f07eadc647bf227fa3ba2ccad0fe81195f5
0df96f063ed8583a16434c58a09761d65ab1aa45
74fbcd830f062b37579daedb439cd29f8fc3426e
5d43060eae83e900f29ed87ec7ecc7c0970ddf36
e8ca9ef732a81609097a40e66cf4595607dc01ad
a227c1647381c5c70524fa225454e67bbf0eab51
4482f38fa394bff1d040d7af6ffc3197c8cc2fe8
ae9c8c4c1620295fefa2f6ed6c9204f64e796a5f
34119ac35b82766fbb66f4a3fad07773c20ee08e
ac97aa65f331a0007146d31343605d7cff480947
32eb94145b2c89bbcf1ac4059578d99a1905c64b
8e1cdf4240c9f196cc69263c247ee7815810b5e8
159d6005413754434b117140ab19ca173a115ab5
9db51f765cdf90024c8ecabba4031d8e5142717f
f0c36be712f69718f3757c8bf3a349cc75f0b61d
d40bb4dea60fcbfae7e84a1e8b2669ab31d04944
2043e95408976a879bc153e9f72725fa43e79f71
8a86749753e83b9516beb9224629cba4c142bf9e
ce9ef24adf7c44c087c49b85cd1fb2c1f6fd074b
34b15687a0ee6fb6e529d3d652b714be9d53c230
a76a8ec50d485591f24f1218773edb766d9feb4e
5ecec325b90e29462174bf36aec44fb3ac57bf13
62c1ba5ad7c5b74488f9f8c4707504202ecaa498
24af07468760a7d58cafadc94ff648a8d279aa34
faeec111a401183da874d0feaaa63104da45f07a
eaa5c1d1256c2c700621d7ab9fbefb692217e93c
604f8b1ed33a7c3fa93889ed77433fa8396348c2
72e7c725860c2656f2d24cb850b2535aed6c1f7d
65720cf08d35968c63c7b85b67fe7ad4f7c0b07a
0244a9e4fd8a186d2a232abe632e75bb33d946ba
b67161169bbba39abb6327c9cefb1ee28961e743
057a9c10c0a2da25d237e953f34bb05bf417fc4e
7cfe35f51f54199b21541dd5d1d171c11d1bea3b
90033f6fe351f1862ad13e937442c10814f22ca9
d98c01c94caa8fb1196ecd99a133f147a9d77e32
533adb9aed63672d170d8e7c75c8ffb694249d10
eb69b92f8964cf16740d8a4c6cc86f7c40e2a613
fef2d3bf8aeffef583fc9f083e2fa5b7b2fec7b6
401acdfed4df133a6a02e753def5aa6c5283b630
a737580886187327c2e34c73d21c14fb054f82bc
e846c2ed168aa164bae78bac7a101d79d2728c0d
1f4957ca82af70f81849d113ee848db38f37fff0
40b13f23a7fa7b0a9fc81002619cddc98019d1c2
cc021b41837dcf733b79d92a2dfb31a63af81451
4451243dad5172df0253b01c6cd4215859a4fb29
ae4bccd75b75d6bf800cfeb8444788803c3ade2a
c4f631d185987e98b17243f406af58941b0c0a64
e51f3bbcc586e59b0e7712448f9e9e1587d76b64
247a804eef2191cf740e6c01ef03ab7bdaaca0f7
99eb299b51fa3a3e2d925472900e3c55ea2d545a
afdbb834d28964461afeb3059b2363088692311a
c087c50b9350c2a5e38107b9b37b7ea192c618c0
26b951e359896d96a4ce11cc279d26de9dff854d
c877002e29b69b5a1e5d54318317124e8a4d66bc
b8f206a19ca75c25914dd7f7c1a246d9404dc235
e4413eee1fb2a137ff9628fe4cf7863c34d199e6
ce18ec722cbd8e69d08178ef594768ee10afdc68
2efb34fed0631b19312fc14e958eb79520e3066a
68eceda6b12cb556d57d9a37387be9bc566ec353
eb7bce74395a989ffa97021d37ac6876a6bf0211
4e481da4931c9dc31ddf420a78640910ebc88724
23d2d38febdcd7c166dbc3e0c54f6af0afe9580d
ecada9a3a8c3bfb7f046a529511954787cfb374c
e9557065aec29b9b749007d8ce2e554bd667e385
cff11fb0915558adc02688aba563ad741b48bedc
1e82263c7d8a89158791b024d8b09385a4a14c29
24e6db8e5157a6398a937aeef764fd3aba2eaad6
3dbe7b98c7ae4d59ca0228130a5f1628a9bad658
0695c19827c5c792e8be0e3df05f14c23922a318
eea952b11083b9a651e568605fca196bd92ebe12
df392036e356dfe86b4941f576df8d69db7f75ee
5952b9b095b21b5e7b98375ec0ca9eba63a5c6fc
92d22847128a8ce2ac8c3e0b202400cf3d4bea16
685a01df3f8e8b610704515029fc493d11b1b3af
7ec83e8664298ec47f8c88b4860f31e6c34b7652
f1dc57887b223f9379e831583629734dd9786eaf
ec42725b41311be22dc6c4834763584a88382a5c
537a9c2853e72dcade24a8cacbc095a1395ab5ba
d9bbc6e79b13a20b7f760d337bd8bbc59ca4b7ab
30a055177292dcc3e3b23c99d469984b478d04d4
15f0f27b64f9f6bc5331945397d4b59b7fd3567c
2f087482ff0428518cde1258be49d247180d26a7
5942ccef53964881d4497570c3d6c902eb906e6b
bc07bb51a36a32ade8d3ffda0ddec66c04283934
cb161110adb2fcedcdf9ce0cce875037b1b4cabb
89ff2191ca0782707302f6978f66261be38e8847
bdfc4db674b9b4524bf91fcf84ff97f98e7472c6
77ac196b2a3270f7ad259f1aa5602b02695d3e07
24a9407b2a713ba31bc76c8958cc92cf993ee98e
8fe5ea6b04a20ebadbb3be2f439c63a5257c0c07
b634c0cc239500f8420d84c2751db1b1a44b6fb8
63da09ec9d97a23a789d99601de00f8445a6ece6
321e790f57468ae335d2a0fd321c441f3100f38a
87742ca2d658a60048d1c61f8d410b625021af7d
fbaa02fd24237c9c4d809f64581696b35784943b
bc813f49869bc621d16585d7648ae5e2c4bfe81a
1a6728d9a5a2bc8e6f3febf66414c4dd6562df11
4389700a37b7c41741ad9e6f25743072c3b41889
3c3ba20ad9f923cfd9be6fec74a5100fcee432ed
0cebcae69d28faebb58e1f37f9c9c16ee8b097b1
f3bd49a0c980055d373007a7eca60aa24aa1464c
a72d5ace87979b2b1647ef627be4ea8cc40d562d
3f6ea6ed37ee0948cfa574897261f181ab0af0f8
3f8691614b484f0060b72cf67442bc1a1b79844b
f19f87d7d4325eedb4a266db47cf9a495f6e1ca2
fa9806ab3573a9c353a222da85b041fcc1d87a7c
7f96b230c12f91c3f83238608fb07ff53a32c08c
461c71c97f1e017f0f8827570d5f95f2c741bcef
51f8a8cad4f6faae2f98ca47f47de6670b765786
6b4608c72aa90e30910087cff27b192f18e7c9d1
e682af00fb9e952212cb0eaf63dd5d9b7d2a420b
17b89eea8920d9feec83e8ebbcad6c5063a6a608
864cb5b4b1b86e05dce86410deb6971af9ec9d53
093f4b1b000707456dd95dca2d21b34aa0090af4
574f0d60efa09a5f736ab0cc096ba30114ce5b7d
ee9b1c68d5c3770a80c178d0c967ce55f299d096
a5a92ac439283a2876d39bce2e38348441451c99
6f7ec9398b602574396786567bb735ff00d954f8
270505741eaf8f7325be7ab3277c76abf58e9045
a8b26db33bfb995c2f8298654c183eac11174b17
bac4034ad784e796bc013d874a874e0c38777bcd
e36449722cb15fbf56b65179c8ea6793ec8be906
47333b5cde16838ba7c4a8c64e99445f53c4e7f3
4d7d4e84888eeeefd12f3692320badb19040fe4d
6117b3fc5b30dcec0e3a162d6df5f976db6d1bdb
0ad302940d9e883763df68fe40fbb560aaaaccd6
c3f8fe6d4d980230dc9a32b6d20079c86bcfdd51
eec8c7ae6a3c49b1fd7a58fa1edb4e0a4fbdaef8
97e3ea8d6762476226e00e110d8a33e5630a3a6f
5f36971c01d9a3bc52ee999454c0199eb27a7ff8
b07a5e065a16755cba48d638d72b28c2bd111dac
dbec72854ac57ee4f2937b09eedf373bd49e6e19
4b5a7621be2f99cb6ba75476ea9299e2155b9d16
4278d5b249e8f0302866777e10d57ceff32945cc
5d6cbfff711d6721af44702d9baee487078d77e3
a64b491d710f1258e6b1fd58772726a459ac8e91
14f87963c736094ad35c8e0908514670b2111774
a8f0df2a88064d31ed445a05e032c69ca490fc82
bb9adc17826e2b4df40255f3c7efd366541e1795
088ef02a18ffd0c57fbcc5565358905c624a3dda
0c689b9e7d08a64c320d4769ff6d312ec61f1b00
94fc56e69265f0d61d0cb7e896335d017b77747b
0c5292d265bb33dd3be8b6d217fdfbdb0ad7bcd9
35989c8bb8226c0d15bf02cd07ab23a5237d6eff
fb1385b87914ddc040630bbe0d10c5a40bdc8b99
d9a3d2dc612cd1c5956ae98bb9393c4b58f94653
9caa328dcaa35b751c48f2e2197ce92104cdf132
3fb6f45c7a48a148cfc94afd4475e90a8d56f15f
1bbb6616fbf5393a984bda57e2d7423d15e06d7f
8c00bda7dbc94eae694acb5e0204c8b12eec633a
c49f1656c78bfe96ea2c562f3bba3f80e294157f
9da44b990faf882f0988bb419456fa7a466e3d67
882cb7a3eac6de74cc913ce9fdc898c8fe0728b2
2da11a5f987d00e235ec6b7d7ea5d072b6a36198
afb668cb39cf623379989209a3f6cf4584eae71b
224b098a0dfc5adf8da010713ae55588d411c011
b7c3abf5004ccda474507dd39c0c52d579186584
63496f31a39d0bbfc35460259d90e4c5053c1db5
52189aced1a306c35cd2ad4af6db8826aa879837
51e91ee29e272e8d6af2854b46ff54096b942108
669cf794d179668c1176d0f7b3e9af0cc266187a
9c8444ae737cab7a94bd62edb0e06a70699cdad1
03c315ebbbfa321d8494f2ee5d32ad09ed2eb4a5
7bd1de71a7e6a8a4e2104fe8a92255c957f2094e
82917923a05f944ff8e283dc3846e06fb4a97b7c
f1c1f30dd2b9a0720f3c2821c11a65f6908e50c0
f6912be94e6e4cf913c639398cffac55c5c96fa9
00538e7cc48ade86b72f17a41c4e5dd28ad6051d
659dac168fc571efe6872ed61abfce4a5800fb2c
f7e26d7590574085fe389c8f8a8abfd28cb20499
89a2de5b935125ab917af7f8107d7f93e80f7cb6
cdbc3d9be43d180f90d02ba4dce6fb76c6d25774
e7a7d4b282560f435be995fe0a08f992d944bee8
7b958fda8aa5befdb950b226214cc89a982f696b
ac333d0828cb9e772799d33a99ee2931fa6800d1
f8e6dac639b6437f73ee607da87f737911aa9c63
5152e54cd53dda2261269fe0ecbd4e73b1d54e79
6a58a375b667a3447bf28527937ddd2cf8ec3a95
f98711e799efc4ce3799b4ffde9e021a0f2ffded
0cac2e6e1a0642f65963b2aceb34a38dce332956
c6d6a174294ac9e6598f4eb7e44114419e083474
81f0bcc195e06efeee1e1c1f38a5e857aebdbc27
6ab256bc23ca59ebca0e282732e9bd3e1e8eb41f
30a0d5b5f6ed421bff78e92320c91841aa7fc5e1
1970e0617e9671f155b866f7b27c70d91975f153
0fbfa1e96b069d605d5cb6fe91aa7e88baeb46dd
9b981ea6e8cbc1c9bab4b23576bb58dd3026ea42
7b12db3d9acd7a1198dba333387b37aaf7db2ff8
16773e75599c05f867f44fa622636031f75bd8c8
00dc8386150c5da6207cd6f59a048ae26e38e136
25479f2a5fffce7ff304d6b38c979581b32dc801
fdd69aa8e1d79ef14fb0448b3ee702982e43f9da
1bc9419eb983a1bb2dd99645476b16670f5a565a
4ff4d11309aa6d40595ed6ec89d800c39bfcdf9c
015fce0deaf6b2edc5b4072d0fdddd65096f61c4
2918708fb475111254a86f6303a0e0fb23ac0c6c
763434d4868607ea78d5d1d233551f41490f6c4c
9161f79fc60c3d022be68c1c919168705af970f6
bdac91314d94d450695afe886069df1def8cd1af
dd125a19e527939ff5c128856283e0bc4bc0def3
0ae571409ca712c0e6032ff34a662fea009fde7c
d720a14a295d5c1f73db93e8b65b9fa459464018
cb5b188dc0b07d264bbe59f0507a56b1a2a14ea4
e7427ec396688045c49a33df0bd997c6d0baf078
3f1075a79528d14ea34c921fab1a79791af034be
88bf113c19036b381fcc477166af1c2f98bf3e8d
3d8be7ae7c28d86d733165b135781c8947e3330e
61df3f49ca44afb570b4c7508238b7ebfebaab01
b95cb445d214687f20e728012f07606df5a6e9f3
6f7ebede0ca8a72d6b6f7ccf0a9106bb862cac39
feb0bebc498f8bf64ef9f2286c5c1cebb5127c4f
493840379aa8b915916a6ae6135ed8ccc3038bea
2fbe8142d19ed8cf0d6399f63214adcff09c1325
592e3a4b0501cfa5a0dbe85693bd33cab18e5ce9
4dedc70f7dcecedc52e5f8dd2532ec9666308c96
1f65b29dd8870d17100089e934c27e3774d136d1
5cbd3ea1b5a3b584b4fea043c9ecfec6396d9ee8
dbb626353928f9a130d707c057b038ff38ab9dca
64a24f404516f0c54222749fe7e924cce6706b40
0c40065b190b1eabb3ec95eb835a2f8decac81ff
e029468a13c3e8c0b6030a3276a179990d1de11e
8c3eb214a98cad32e9798a2082170de6fd040870
5a08d61c877932e39b997fff9e9980b2456dc348
1a77d09fac5c722e294a1a8f9846758caa5a7c2a
918b7ba206cc5e0a97dd86e82695772c25ce8347
7b433cd386abbb190cbde543708eaaf0dfd567bd
af7d0f4b31df1bf21bf91cba6946685235ab3ece
55e4d2a715c262dbdd5df12944e966bef9ee3d72
25a091ed28521fea47632909651a725fc7eca153
f46610f88beaa8b937097461b5fb77d2967f7016
0f56674cf0f18f39e18918c2191417b69ed2ea82
b5667380011d1f940fd03d2f22ffefd380fe816e
ec411e94da0c4dbcd4078483689d0f409d59d278
8838b5495fa752aa388c09eb28be989f320269f0
d0b603a0cd9ef29aaaeecd5094df91a29222a4b6
18b6620ad991c1e7896cf605377be10fa6569387
d92edfb0b0d787f072513b68b9aff16f2021a678
91c0c1881b5186f479db3f1046e207291b077582
68abc449f309e8b27c18f7e076721736620a1f21
cce6379b13070616fd186c01dee622366ec3c517
69195deb45197ffd6a6a78a72df65df3108fff6a
798f3bb9f5eb16724ad4eef99967155ecd00b602
6921ff7af74065190741e1a718f8a0551825a095
e1490bc7b17ae36c6f081b092014754ae3a8c115
3be4ee51309b570f6617403f24b1c8662f35c487
6546ded1458f724d33ffe527cfaf453d8979da0a
74dd6ca3e4d2f88db6d8205b2118a8e2f08475ed
b127757f8912661d9d9292db7567782e042d464b
3994d71451bc8596310945e043cf31018212d815
23e91efb4050638a050125af743862915875bc11
e90589481e62211a0c57fff537c20db4226c3a47
9571c5a872379c646a04d0b2701602d3cff93521
7c71eb8fb1af846c5acb56809d0064a3e1ae25f8
2e195af1554cf51d9d57ad11b63862e9bc6c64e0
5d8e7ca80a359c04b1e5839266647245c8b05a0d
fbdd0b7881be637f8893f8f138805e56d06aa22d
f852135775123a7d2f4d4338038f97bfda21efd0
17555a94a9fae749331872c0cff2da8b1aca42d4
0df719c6bd8d001311418c3b4bcc31d417d184ab
67e9f09358bfd180d71c19d12377e72b8601a7bf
38f275621c9727894c80d37922023b1e82a62c13
57f965d3c06817386be9519a1384f699d7ddf523
4b3798280cbf3b9735a54a982868e8cc91eb046f
a72121b9551921aa3dced32d943c6034ba318f82
955add0b09637e7ecdd62411272b2d0ef84d3aa3
ce6c5aac0db5476dc496c34388e4f9ce2c4b86e5
b46b1e64f06f448bde78b98e3ae8228ce5f96067
END_SECTION COMMITS)
[//]: # (START_SECTION 7c86d935be95d9838f45727025d442f55a8456a4)
### Error fixes (#677)

> Commit: [7c86d935be95d9838f45727025d442f55a8456a4](https://github.com/dOpensource/dsiprouter/commit/7c86d935be95d9838f45727025d442f55a8456a4)  
> Date: Fri, 18 Jul 2025 10:33:42 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: GitHub (noreply@github.com)  
> Signed:   


- * Update v0.78 Upgrade With DB Changes
- * Fix "sdp_transport_helper(): malformed or non AVP $dlg_var(src_media_tp)"
- `sdp_transport` does not support dlg_var, switch to pv
- remove inaccurate dlg_var on MANAGE_REPLY
- set default for rtpengine to enabled when dlg flag is not set
- * Revert Media Handling Improvements
- not enough time to revalidate, will revisit in next release
- fix rtpengine enabled on direct media


---

[//]: # (END_SECTION 7c86d935be95d9838f45727025d442f55a8456a4)
[//]: # (START_SECTION 844fdfd70c526e3e3f4b94ca91de5a74bab12213)
### Fixed error message when configuresslcert is executed

> Commit: [844fdfd70c526e3e3f4b94ca91de5a74bab12213](https://github.com/dOpensource/dsiprouter/commit/844fdfd70c526e3e3f4b94ca91de5a74bab12213)  
> Date: Fri, 18 Jul 2025 13:24:20 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 844fdfd70c526e3e3f4b94ca91de5a74bab12213)
[//]: # (START_SECTION 8261be6d3e1772d94acb1d8c8de194a0b4afbdd6)
### Update README.md

> Commit: [8261be6d3e1772d94acb1d8c8de194a0b4afbdd6](https://github.com/dOpensource/dsiprouter/commit/8261be6d3e1772d94acb1d8c8de194a0b4afbdd6)  
> Date: Fri, 18 Jul 2025 07:59:55 -0400  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: GitHub (noreply@github.com)  
> Signed:   




---

[//]: # (END_SECTION 8261be6d3e1772d94acb1d8c8de194a0b4afbdd6)
[//]: # (START_SECTION c1b270c5efb9f1640ed0a32a7d9c0d7f96b1a02d)
### WebRTC Fixes to handle a more compliant WebRTC client called Jambonz, which is based on JsSIP

> Commit: [c1b270c5efb9f1640ed0a32a7d9c0d7f96b1a02d](https://github.com/dOpensource/dsiprouter/commit/c1b270c5efb9f1640ed0a32a7d9c0d7f96b1a02d)  
> Date: Fri, 18 Jul 2025 11:52:25 +0000  
> Author: root (root@mack.test.dsiprouter.net)  
> Committer: root (root@mack.test.dsiprouter.net)  
> Signed:   




---

[//]: # (END_SECTION c1b270c5efb9f1640ed0a32a7d9c0d7f96b1a02d)
[//]: # (START_SECTION 58096c74533221acc325c101627b8f8a8ada1282)
### Update of login page and logo

> Commit: [58096c74533221acc325c101627b8f8a8ada1282](https://github.com/dOpensource/dsiprouter/commit/58096c74533221acc325c101627b8f8a8ada1282)  
> Date: Thu, 17 Jul 2025 04:26:23 +0000  
> Author: root (root@mack.test.dsiprouter.net)  
> Committer: root (root@mack.test.dsiprouter.net)  
> Signed:   




---

[//]: # (END_SECTION 58096c74533221acc325c101627b8f8a8ada1282)
[//]: # (START_SECTION c8c6ba9ded2fc109099a8fd3c9e7775ea61560c5)
### Update v0.78 Upgrade With DB Changes

> Commit: [c8c6ba9ded2fc109099a8fd3c9e7775ea61560c5](https://github.com/dOpensource/dsiprouter/commit/c8c6ba9ded2fc109099a8fd3c9e7775ea61560c5)  
> Date: Mon, 14 Jul 2025 12:16:13 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   




---

[//]: # (END_SECTION c8c6ba9ded2fc109099a8fd3c9e7775ea61560c5)
[//]: # (START_SECTION a252b7e6646a684a44946f48bc93f78335d559f4)
### Fix Failure Routing

> Commit: [a252b7e6646a684a44946f48bc93f78335d559f4](https://github.com/dOpensource/dsiprouter/commit/a252b7e6646a684a44946f48bc93f78335d559f4)  
> Date: Mon, 14 Jul 2025 10:53:06 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- move 3xx blocking up in faliure route
- move timeout check to after failover/hard fwd checks
- dsip_prefix_mapping view only includes inbound routes now


---

[//]: # (END_SECTION a252b7e6646a684a44946f48bc93f78335d559f4)
[//]: # (START_SECTION 31d9a61fe5e5698a83ba460a347ca2d9d681904f)
### Cluster Fixes

> Commit: [31d9a61fe5e5698a83ba460a347ca2d9d681904f](https://github.com/dOpensource/dsiprouter/commit/31d9a61fe5e5698a83ba460a347ca2d9d681904f)  
> Date: Mon, 14 Jul 2025 09:44:50 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- do not allow debian images without systemd-resolved to install with `-dns`
- fix return code of each install on `clusterinstall` subcommand


---

[//]: # (END_SECTION 31d9a61fe5e5698a83ba460a347ca2d9d681904f)
[//]: # (START_SECTION 902c53e6ea1b56ba293362fd7147f954fe5b87f0)
### Extra Check for Carrier Load Balancing

> Commit: [902c53e6ea1b56ba293362fd7147f954fe5b87f0](https://github.com/dOpensource/dsiprouter/commit/902c53e6ea1b56ba293362fd7147f954fe5b87f0)  
> Date: Fri, 11 Jul 2025 08:25:06 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- if dispatcher entry does not yet exist when updating, create it


---

[//]: # (END_SECTION 902c53e6ea1b56ba293362fd7147f954fe5b87f0)
[//]: # (START_SECTION 10cdc797dddb3053dfa574dcd10e5fe0696cffe8)
### Load Balancing Fixes

> Commit: [10cdc797dddb3053dfa574dcd10e5fe0696cffe8](https://github.com/dOpensource/dsiprouter/commit/10cdc797dddb3053dfa574dcd10e5fe0696cffe8)  
> Date: Thu, 10 Jul 2025 11:53:24 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- fix load balancing regression
- set more sane defaults for rweight/keepalive


---

[//]: # (END_SECTION 10cdc797dddb3053dfa574dcd10e5fe0696cffe8)
[//]: # (START_SECTION 2485a964ccf7d5eab5c719d9fe1d24221e79ff41)
### Fix CLI Debug Handling

> Commit: [2485a964ccf7d5eab5c719d9fe1d24221e79ff41](https://github.com/dOpensource/dsiprouter/commit/2485a964ccf7d5eab5c719d9fe1d24221e79ff41)  
> Date: Wed, 9 Jul 2025 11:00:59 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- `dsiprouter start -debug` now works as intended (blocking)
- allow environment variables being passed when started in debug mode


---

[//]: # (END_SECTION 2485a964ccf7d5eab5c719d9fe1d24221e79ff41)
[//]: # (START_SECTION 37fe6c03ed7e798119732367dc1896fa93d3182f)
### Fix Record Routing for Some NAT Scenarios

> Commit: [37fe6c03ed7e798119732367dc1896fa93d3182f](https://github.com/dOpensource/dsiprouter/commit/37fe6c03ed7e798119732367dc1896fa93d3182f)  
> Date: Tue, 8 Jul 2025 13:16:09 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  




---

[//]: # (END_SECTION 37fe6c03ed7e798119732367dc1896fa93d3182f)
[//]: # (START_SECTION 49ba3a7b761ef8f7c71de501c66bdadeeddc70ac)
### Resolves #640

> Commit: [49ba3a7b761ef8f7c71de501c66bdadeeddc70ac](https://github.com/dOpensource/dsiprouter/commit/49ba3a7b761ef8f7c71de501c66bdadeeddc70ac)  
> Date: Tue, 11 Mar 2025 11:51:05 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   




---

[//]: # (END_SECTION 49ba3a7b761ef8f7c71de501c66bdadeeddc70ac)
[//]: # (START_SECTION 5995b5b7296506b72e5863aba07d1343acb9e113)
### Resolves #637

> Commit: [5995b5b7296506b72e5863aba07d1343acb9e113](https://github.com/dOpensource/dsiprouter/commit/5995b5b7296506b72e5863aba07d1343acb9e113)  
> Date: Thu, 13 Mar 2025 13:21:33 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   




---

[//]: # (END_SECTION 5995b5b7296506b72e5863aba07d1343acb9e113)
[//]: # (START_SECTION 23b1395497f61ec9a8f60ab63dd394397e1866b6)
### Fix Typos in Deb12 DnsMasq Install

> Commit: [23b1395497f61ec9a8f60ab63dd394397e1866b6](https://github.com/dOpensource/dsiprouter/commit/23b1395497f61ec9a8f60ab63dd394397e1866b6)  
> Date: Thu, 20 Mar 2025 12:04:50 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   




---

[//]: # (END_SECTION 23b1395497f61ec9a8f60ab63dd394397e1866b6)
[//]: # (START_SECTION 3007c0e8499cc95673704a420dee938dd424ef9e)
### Fix Amzn2 RTPEngine Install

> Commit: [3007c0e8499cc95673704a420dee938dd424ef9e](https://github.com/dOpensource/dsiprouter/commit/3007c0e8499cc95673704a420dee938dd424ef9e)  
> Date: Wed, 9 Apr 2025 08:24:31 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- bump rtpengine to mr11.5.1.11
- update dependencies


---

[//]: # (END_SECTION 3007c0e8499cc95673704a420dee938dd424ef9e)
[//]: # (START_SECTION e1e287dd579ff03c0407b90d047d76e10a2ad52f)
### Fix Amzn2 Kamailio Install

> Commit: [e1e287dd579ff03c0407b90d047d76e10a2ad52f](https://github.com/dOpensource/dsiprouter/commit/e1e287dd579ff03c0407b90d047d76e10a2ad52f)  
> Date: Mon, 7 Apr 2025 13:56:51 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   




---

[//]: # (END_SECTION e1e287dd579ff03c0407b90d047d76e10a2ad52f)
[//]: # (START_SECTION 8f427d4f46d64c4ead9c32402d56f509f63850c9)
### Fix AWS Image Creation

> Commit: [8f427d4f46d64c4ead9c32402d56f509f63850c9](https://github.com/dOpensource/dsiprouter/commit/8f427d4f46d64c4ead9c32402d56f509f63850c9)  
> Date: Tue, 1 Apr 2025 14:54:49 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- various updates to cleanup logic for golden images
- add support for `dnf` in cloud build scripts


---

[//]: # (END_SECTION 8f427d4f46d64c4ead9c32402d56f509f63850c9)
[//]: # (START_SECTION 155f1594e37d88e14dc9699cc75cba04f3d6b2f0)
### Update Demo API Token

> Commit: [155f1594e37d88e14dc9699cc75cba04f3d6b2f0](https://github.com/dOpensource/dsiprouter/commit/155f1594e37d88e14dc9699cc75cba04f3d6b2f0)  
> Date: Tue, 11 Mar 2025 13:30:00 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   




---

[//]: # (END_SECTION 155f1594e37d88e14dc9699cc75cba04f3d6b2f0)
[//]: # (START_SECTION ababcdd35782a7234b14e9a8c9630e2127bfc52e)
### Add Support for Upgrading to v0.78 (#674)

> Commit: [ababcdd35782a7234b14e9a8c9630e2127bfc52e](https://github.com/dOpensource/dsiprouter/commit/ababcdd35782a7234b14e9a8c9630e2127bfc52e)  
> Date: Thu, 3 Jul 2025 11:17:04 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: GitHub (noreply@github.com)  
> Signed:   


- * Add Support for Upgrading to v0.78
- * Fix Multiple Settings Effected by Updates
- fixes `setConfigAttrib()` matching other settings partially


---

[//]: # (END_SECTION ababcdd35782a7234b14e9a8c9630e2127bfc52e)
[//]: # (START_SECTION 73cb9b23631150873b18c39696018a4f599738a9)
### Add FusionPBX Provisioning Permissions to chown Subcommand

> Commit: [73cb9b23631150873b18c39696018a4f599738a9](https://github.com/dOpensource/dsiprouter/commit/73cb9b23631150873b18c39696018a4f599738a9)  
> Date: Thu, 3 Jul 2025 07:50:02 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  




---

[//]: # (END_SECTION 73cb9b23631150873b18c39696018a4f599738a9)
[//]: # (START_SECTION 303bf86be04320131b8fce613e19aa71dfd7ce75)
### Version and logo update

> Commit: [303bf86be04320131b8fce613e19aa71dfd7ce75](https://github.com/dOpensource/dsiprouter/commit/303bf86be04320131b8fce613e19aa71dfd7ce75)  
> Date: Wed, 2 Jul 2025 11:16:53 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 303bf86be04320131b8fce613e19aa71dfd7ce75)
[//]: # (START_SECTION 52e07933e0845f85c95c6c05af3e4a7b9ad3f2c2)
### Fix from merge

> Commit: [52e07933e0845f85c95c6c05af3e4a7b9ad3f2c2](https://github.com/dOpensource/dsiprouter/commit/52e07933e0845f85c95c6c05af3e4a7b9ad3f2c2)  
> Date: Sun, 29 Jun 2025 01:28:43 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 52e07933e0845f85c95c6c05af3e4a7b9ad3f2c2)
[//]: # (START_SECTION a39ef41fa5eb058903ca03f8b923570aac7ff15a)
### Added changes for WebRTC fixes: #666

> Commit: [a39ef41fa5eb058903ca03f8b923570aac7ff15a](https://github.com/dOpensource/dsiprouter/commit/a39ef41fa5eb058903ca03f8b923570aac7ff15a)  
> Date: Sun, 29 Jun 2025 01:16:03 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION a39ef41fa5eb058903ca03f8b923570aac7ff15a)
[//]: # (START_SECTION 3dd1156097fefd98be296dc312bbc03eb3c58002)
### Added a commit to allow WebRTC clients using PassThru auth to automatically translate secure SDP into non-secure SDP if the Media setting on the endpoint is proxy

> Commit: [3dd1156097fefd98be296dc312bbc03eb3c58002](https://github.com/dOpensource/dsiprouter/commit/3dd1156097fefd98be296dc312bbc03eb3c58002)  
> Date: Sat, 28 Jun 2025 00:38:07 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 3dd1156097fefd98be296dc312bbc03eb3c58002)
[//]: # (START_SECTION fd1696c6f460afdac86e5e56414b975ecc3c37ec)
### Added support for OnHold

> Commit: [fd1696c6f460afdac86e5e56414b975ecc3c37ec](https://github.com/dOpensource/dsiprouter/commit/fd1696c6f460afdac86e5e56414b975ecc3c37ec)  
> Date: Fri, 23 May 2025 04:58:38 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION fd1696c6f460afdac86e5e56414b975ecc3c37ec)
[//]: # (START_SECTION 0717ce38b28066de5749decbc3aa65bf65051956)
### Added logic to handle BYE's and ACK's for WebRTC

> Commit: [0717ce38b28066de5749decbc3aa65bf65051956](https://github.com/dOpensource/dsiprouter/commit/0717ce38b28066de5749decbc3aa65bf65051956)  
> Date: Thu, 19 Jun 2025 03:10:46 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 0717ce38b28066de5749decbc3aa65bf65051956)
[//]: # (START_SECTION b580cc323974d7aba05932392940050f14350858)
### Fixed ACK issue

> Commit: [b580cc323974d7aba05932392940050f14350858](https://github.com/dOpensource/dsiprouter/commit/b580cc323974d7aba05932392940050f14350858)  
> Date: Fri, 13 Jun 2025 22:36:03 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION b580cc323974d7aba05932392940050f14350858)
[//]: # (START_SECTION 5c5eb60127bc8b176e933c39f30a60a56d08a312)
### Added logic in the LOCATION route to make it transport and signaling aware so that calls are properly routed and translated via the RTPENGINE

> Commit: [5c5eb60127bc8b176e933c39f30a60a56d08a312](https://github.com/dOpensource/dsiprouter/commit/5c5eb60127bc8b176e933c39f30a60a56d08a312)  
> Date: Wed, 11 Jun 2025 21:24:35 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 5c5eb60127bc8b176e933c39f30a60a56d08a312)
[//]: # (START_SECTION 49e9c8c9f4ab16572259a178182437a5b8ef44d8)
### Added support for OnHold

> Commit: [49e9c8c9f4ab16572259a178182437a5b8ef44d8](https://github.com/dOpensource/dsiprouter/commit/49e9c8c9f4ab16572259a178182437a5b8ef44d8)  
> Date: Fri, 23 May 2025 04:58:38 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 49e9c8c9f4ab16572259a178182437a5b8ef44d8)
[//]: # (START_SECTION b46787c059a00d4a8b17a957df3f696f3dad682d)
### Added a flag that would trigger RTPENGINEANSER

> Commit: [b46787c059a00d4a8b17a957df3f696f3dad682d](https://github.com/dOpensource/dsiprouter/commit/b46787c059a00d4a8b17a957df3f696f3dad682d)  
> Date: Fri, 16 May 2025 22:02:40 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION b46787c059a00d4a8b17a957df3f696f3dad682d)
[//]: # (START_SECTION e606c4765084386cf03740c99cb8916bcc78f7f3)
### Added a commit to allow WebRTC clients using PassThru auth to automatically translate secure SDP into non-secure SDP if the Media setting on the endpoint is proxy

> Commit: [e606c4765084386cf03740c99cb8916bcc78f7f3](https://github.com/dOpensource/dsiprouter/commit/e606c4765084386cf03740c99cb8916bcc78f7f3)  
> Date: Sat, 28 Jun 2025 00:38:07 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION e606c4765084386cf03740c99cb8916bcc78f7f3)
[//]: # (START_SECTION 17a10889ddc23eee8f9392319fee27e6401bcb70)
### Added support for OnHold

> Commit: [17a10889ddc23eee8f9392319fee27e6401bcb70](https://github.com/dOpensource/dsiprouter/commit/17a10889ddc23eee8f9392319fee27e6401bcb70)  
> Date: Fri, 23 May 2025 04:58:38 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 17a10889ddc23eee8f9392319fee27e6401bcb70)
[//]: # (START_SECTION 08ea093039491b124b09bd4b21f63fd629019afd)
### Revert "Location Lookup Improvements"

> Commit: [08ea093039491b124b09bd4b21f63fd629019afd](https://github.com/dOpensource/dsiprouter/commit/08ea093039491b124b09bd4b21f63fd629019afd)  
> Date: Fri, 27 Jun 2025 01:14:36 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   


- This reverts commit a85ae0c02f89bcf0539c56201a58e5d01585f062.


---

[//]: # (END_SECTION 08ea093039491b124b09bd4b21f63fd629019afd)
[//]: # (START_SECTION 9e2e812346a002b11e66ef6bd87ce72e130b198d)
### Revert "Revert Carrier Redial Location Lookup"

> Commit: [9e2e812346a002b11e66ef6bd87ce72e130b198d](https://github.com/dOpensource/dsiprouter/commit/9e2e812346a002b11e66ef6bd87ce72e130b198d)  
> Date: Fri, 27 Jun 2025 01:14:33 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   


- This reverts commit f298cc3ba4118807586579090c473df2035189e5.


---

[//]: # (END_SECTION 9e2e812346a002b11e66ef6bd87ce72e130b198d)
[//]: # (START_SECTION f298cc3ba4118807586579090c473df2035189e5)
### Revert Carrier Redial Location Lookup

> Commit: [f298cc3ba4118807586579090c473df2035189e5](https://github.com/dOpensource/dsiprouter/commit/f298cc3ba4118807586579090c473df2035189e5)  
> Date: Thu, 26 Jun 2025 13:14:15 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- too close to release, reverting this extra feature


---

[//]: # (END_SECTION f298cc3ba4118807586579090c473df2035189e5)
[//]: # (START_SECTION a85ae0c02f89bcf0539c56201a58e5d01585f062)
### Location Lookup Improvements

> Commit: [a85ae0c02f89bcf0539c56201a58e5d01585f062](https://github.com/dOpensource/dsiprouter/commit/a85ae0c02f89bcf0539c56201a58e5d01585f062)  
> Date: Thu, 26 Jun 2025 13:03:51 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- Resolves #669
- allow phones on other side of carrier to redial a registered device
- remove local exten length check and continue routing if no device found


---

[//]: # (END_SECTION a85ae0c02f89bcf0539c56201a58e5d01585f062)
[//]: # (START_SECTION fbd0f7c84e4cd66e7f0d694a965abc259f333683)
### - Added logic to properly enable the RTPEngine on 200OK's - fixed #661 - Added logic to correctly process Extension to Extension calls that use Domain Routing

> Commit: [fbd0f7c84e4cd66e7f0d694a965abc259f333683](https://github.com/dOpensource/dsiprouter/commit/fbd0f7c84e4cd66e7f0d694a965abc259f333683)  
> Date: Thu, 26 Jun 2025 18:11:06 +0000  
> Author: root (root@ip-172-31-53-209)  
> Committer: root (root@ip-172-31-53-209)  
> Signed:   




---

[//]: # (END_SECTION fbd0f7c84e4cd66e7f0d694a965abc259f333683)
[//]: # (START_SECTION a638bc71661c89be5881a9d776b9f73a6ad0af97)
### Updated device provisioning documentation

> Commit: [a638bc71661c89be5881a9d776b9f73a6ad0af97](https://github.com/dOpensource/dsiprouter/commit/a638bc71661c89be5881a9d776b9f73a6ad0af97)  
> Date: Sun, 22 Jun 2025 07:59:26 -0400  
> Author: Mack Hendricks (mhendricks@sangoma.com)  
> Committer: Mack Hendricks (mhendricks@sangoma.com)  
> Signed:   




---

[//]: # (END_SECTION a638bc71661c89be5881a9d776b9f73a6ad0af97)
[//]: # (START_SECTION 952f0655d49ad7ab60c106b4f108945070b7c8eb)
### Moves nginx changes to the FusionPBX module install script

> Commit: [952f0655d49ad7ab60c106b4f108945070b7c8eb](https://github.com/dOpensource/dsiprouter/commit/952f0655d49ad7ab60c106b4f108945070b7c8eb)  
> Date: Thu, 19 Jun 2025 21:50:24 +0000  
> Author: root (root@mack.test.dsiprouter.net)  
> Committer: root (root@mack.test.dsiprouter.net)  
> Signed:   




---

[//]: # (END_SECTION 952f0655d49ad7ab60c106b4f108945070b7c8eb)
[//]: # (START_SECTION a058f7f1054f5c65c330f0424e732ce6861793bc)
### Added logic to write out the Nginx configuration for FusionPBX Provisioning within the /etc/nginx/sites-enabled directory

> Commit: [a058f7f1054f5c65c330f0424e732ce6861793bc](https://github.com/dOpensource/dsiprouter/commit/a058f7f1054f5c65c330f0424e732ce6861793bc)  
> Date: Thu, 19 Jun 2025 21:13:05 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION a058f7f1054f5c65c330f0424e732ce6861793bc)
[//]: # (START_SECTION f3993379b9ba18b9b4a26eba2611c03ac64b568f)
### Added logic to handle BYE's and ACK's for WebRTC

> Commit: [f3993379b9ba18b9b4a26eba2611c03ac64b568f](https://github.com/dOpensource/dsiprouter/commit/f3993379b9ba18b9b4a26eba2611c03ac64b568f)  
> Date: Thu, 19 Jun 2025 03:10:46 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION f3993379b9ba18b9b4a26eba2611c03ac64b568f)
[//]: # (START_SECTION febc0d9073bf1834e0fc13dbaf893cb9179a82d6)
### Fixed ACK issue

> Commit: [febc0d9073bf1834e0fc13dbaf893cb9179a82d6](https://github.com/dOpensource/dsiprouter/commit/febc0d9073bf1834e0fc13dbaf893cb9179a82d6)  
> Date: Fri, 13 Jun 2025 22:36:03 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION febc0d9073bf1834e0fc13dbaf893cb9179a82d6)
[//]: # (START_SECTION 01171453f8bfe861f37aceb332ada09057ad4b59)
### Added logic in the LOCATION route to make it transport and signaling aware so that calls are properly routed and translated via the RTPENGINE

> Commit: [01171453f8bfe861f37aceb332ada09057ad4b59](https://github.com/dOpensource/dsiprouter/commit/01171453f8bfe861f37aceb332ada09057ad4b59)  
> Date: Wed, 11 Jun 2025 21:24:35 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 01171453f8bfe861f37aceb332ada09057ad4b59)
[//]: # (START_SECTION d61ec9564deeca1999c61f0683af50bf8b74730d)
### Cleaned up xlog comments

> Commit: [d61ec9564deeca1999c61f0683af50bf8b74730d](https://github.com/dOpensource/dsiprouter/commit/d61ec9564deeca1999c61f0683af50bf8b74730d)  
> Date: Tue, 10 Jun 2025 03:57:09 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION d61ec9564deeca1999c61f0683af50bf8b74730d)
[//]: # (START_SECTION cdfda0c7319e70217b1d6f5570ba7d242e181b4b)
### Fixing broken edit/delete links on domains

> Commit: [cdfda0c7319e70217b1d6f5570ba7d242e181b4b](https://github.com/dOpensource/dsiprouter/commit/cdfda0c7319e70217b1d6f5570ba7d242e181b4b)  
> Date: Fri, 6 Jun 2025 23:03:26 -0500  
> Author: Micah Quinn (micah.quinn@sipiq.com)  
> Committer: Micah Quinn (micah.quinn@sipiq.com)  
> Signed:   




---

[//]: # (END_SECTION cdfda0c7319e70217b1d6f5570ba7d242e181b4b)
[//]: # (START_SECTION fe6dee1e3bb7f94a87dca23d8f78512fbd7c03b7)
### Added logic to route NOTIFY messages when the RURI contains it's private ip address.  We use the TO header to lookup the real contact address in the location table

> Commit: [fe6dee1e3bb7f94a87dca23d8f78512fbd7c03b7](https://github.com/dOpensource/dsiprouter/commit/fe6dee1e3bb7f94a87dca23d8f78512fbd7c03b7)  
> Date: Sun, 1 Jun 2025 01:49:55 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION fe6dee1e3bb7f94a87dca23d8f78512fbd7c03b7)
[//]: # (START_SECTION 43d053b938a14191b97ce44048a8751021fc6255)
### Added support for OnHold

> Commit: [43d053b938a14191b97ce44048a8751021fc6255](https://github.com/dOpensource/dsiprouter/commit/43d053b938a14191b97ce44048a8751021fc6255)  
> Date: Fri, 23 May 2025 04:58:38 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 43d053b938a14191b97ce44048a8751021fc6255)
[//]: # (START_SECTION 68a2dd685172e2b5521f1b698456b2f0dde077b4)
### Added some notes around setting up Phone Provisioning when dSIPRouter is being used to proxy FusionPBX UI requests

> Commit: [68a2dd685172e2b5521f1b698456b2f0dde077b4](https://github.com/dOpensource/dsiprouter/commit/68a2dd685172e2b5521f1b698456b2f0dde077b4)  
> Date: Wed, 21 May 2025 00:16:42 -0400  
> Author: Mack Hendricks (mhendricks@sangoma.com)  
> Committer: Mack Hendricks (mhendricks@sangoma.com)  
> Signed:   




---

[//]: # (END_SECTION 68a2dd685172e2b5521f1b698456b2f0dde077b4)
[//]: # (START_SECTION 4f2a9f8ad407110852092ce543461972687588df)
### Added a flag that would trigger RTPENGINEANSER

> Commit: [4f2a9f8ad407110852092ce543461972687588df](https://github.com/dOpensource/dsiprouter/commit/4f2a9f8ad407110852092ce543461972687588df)  
> Date: Fri, 16 May 2025 22:02:40 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 4f2a9f8ad407110852092ce543461972687588df)
[//]: # (START_SECTION 656fbc1c50d503d7f14d13674da597ebc4e1f117)
### Converted back the commit

> Commit: [656fbc1c50d503d7f14d13674da597ebc4e1f117](https://github.com/dOpensource/dsiprouter/commit/656fbc1c50d503d7f14d13674da597ebc4e1f117)  
> Date: Wed, 14 May 2025 20:45:37 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 656fbc1c50d503d7f14d13674da597ebc4e1f117)
[//]: # (START_SECTION 186f48f0d295f28527564a3dc3103cab8993f65c)
### Fixes #660 - Added logic to test if the SIP Dialog was already created.  If so, don't create a new SIP Dialog " Fixes #554 - Confirmed that it's fixed Fixes #545 - Confirmed that it's fixed Fixes #520 - Confirmed that it's fixed

> Commit: [186f48f0d295f28527564a3dc3103cab8993f65c](https://github.com/dOpensource/dsiprouter/commit/186f48f0d295f28527564a3dc3103cab8993f65c)  
> Date: Wed, 14 May 2025 20:35:30 +0000  
> Author: root (root@demo.test.dsiprouter.net)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 186f48f0d295f28527564a3dc3103cab8993f65c)
[//]: # (START_SECTION 2b76d501e66b0b22acc911e944f24ca09588cbd7)
### Fixes #660 - Added logic to test if the SIP Dialog was already created.  If so, don't create a new SIP Dialog " Fixes #554 - Confirmed that it's fixed Fixes #545 - Confirmed that it's fixed Fixes #520 - Confirmed that it's fixed

> Commit: [2b76d501e66b0b22acc911e944f24ca09588cbd7](https://github.com/dOpensource/dsiprouter/commit/2b76d501e66b0b22acc911e944f24ca09588cbd7)  
> Date: Wed, 14 May 2025 20:35:30 +0000  
> Author: root (root@demo.test.dsiprouter.net)  
> Committer: root (root@demo.test.dsiprouter.net)  
> Signed:   




---

[//]: # (END_SECTION 2b76d501e66b0b22acc911e944f24ca09588cbd7)
[//]: # (START_SECTION 9b1cab3e12f978ae79c7317b530881a1c6cbe8ae)
### Fixes: - Fixed the contact so that the transport parameter is changed based on the destination - Fixed the Path header so that the transport parameter is defined based on the destination

> Commit: [9b1cab3e12f978ae79c7317b530881a1c6cbe8ae](https://github.com/dOpensource/dsiprouter/commit/9b1cab3e12f978ae79c7317b530881a1c6cbe8ae)  
> Date: Tue, 22 Apr 2025 02:06:23 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 9b1cab3e12f978ae79c7317b530881a1c6cbe8ae)
[//]: # (START_SECTION 6fc2548389b0c6672f9141baf4e53e71bc297184)
### Fixed issue with RE-INVITES from a Carrier to MSTeam causes a 488 from MSTeams with this error message: 'CannotChangeRtcpMultiplexing, InternalErrorPhrase: Cannot change RTCP multiplexing from existing active media'

> Commit: [6fc2548389b0c6672f9141baf4e53e71bc297184](https://github.com/dOpensource/dsiprouter/commit/6fc2548389b0c6672f9141baf4e53e71bc297184)  
> Date: Fri, 18 Apr 2025 00:29:55 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 6fc2548389b0c6672f9141baf4e53e71bc297184)
[//]: # (START_SECTION 3f73914f1225b2836cab1f13e366582a61c183b4)
### Fixed REMOVE_REFER

> Commit: [3f73914f1225b2836cab1f13e366582a61c183b4](https://github.com/dOpensource/dsiprouter/commit/3f73914f1225b2836cab1f13e366582a61c183b4)  
> Date: Mon, 7 Apr 2025 13:15:07 -0400  
> Author: Mack Hendricks (mhendricks@sangoma.com)  
> Committer: Mack Hendricks (mhendricks@sangoma.com)  
> Signed:   




---

[//]: # (END_SECTION 3f73914f1225b2836cab1f13e366582a61c183b4)
[//]: # (START_SECTION 6265abc736c8c08348a951da48b643bd67034b0e)
### Fixed Internal Transfers

> Commit: [6265abc736c8c08348a951da48b643bd67034b0e](https://github.com/dOpensource/dsiprouter/commit/6265abc736c8c08348a951da48b643bd67034b0e)  
> Date: Mon, 7 Apr 2025 11:25:21 -0400  
> Author: Mack Hendricks (mhendricks@sangoma.com)  
> Committer: Mack Hendricks (mhendricks@sangoma.com)  
> Signed:   




---

[//]: # (END_SECTION 6265abc736c8c08348a951da48b643bd67034b0e)
[//]: # (START_SECTION b57a2a3670df1bf0005a4992f2af073e4d85738a)
### Fixed issue with MSTeams calls not hanging up properly

> Commit: [b57a2a3670df1bf0005a4992f2af073e4d85738a](https://github.com/dOpensource/dsiprouter/commit/b57a2a3670df1bf0005a4992f2af073e4d85738a)  
> Date: Sat, 5 Apr 2025 16:50:25 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION b57a2a3670df1bf0005a4992f2af073e4d85738a)
[//]: # (START_SECTION a977b58eee52a00f10ea32f7e9a05f2222037a3d)
### Trigger Jenkins build

> Commit: [a977b58eee52a00f10ea32f7e9a05f2222037a3d](https://github.com/dOpensource/dsiprouter/commit/a977b58eee52a00f10ea32f7e9a05f2222037a3d)  
> Date: Fri, 28 Mar 2025 14:36:48 -0400  
> Author: chelseatcarter (chelseatcarter@gmail.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION a977b58eee52a00f10ea32f7e9a05f2222037a3d)
[//]: # (START_SECTION f47832ae5061628cef09e3198b7a33525f2cd0d9)
### Trigger Jenkins build

> Commit: [f47832ae5061628cef09e3198b7a33525f2cd0d9](https://github.com/dOpensource/dsiprouter/commit/f47832ae5061628cef09e3198b7a33525f2cd0d9)  
> Date: Fri, 28 Mar 2025 14:25:21 -0400  
> Author: chelseatcarter (chelseatcarter@gmail.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION f47832ae5061628cef09e3198b7a33525f2cd0d9)
[//]: # (START_SECTION f2a522d40e62c96bd1e55de7e098cfda9c98fbfe)
### Fixed Issues - REGISTER will now follow the signal settings in the endpoint group for domain routing.  Fixes #656 - Fixed an issue with the REPLACE_CONTACT_DOMAIN route, the semi-colon was missing in the protocal portion of the contact

> Commit: [f2a522d40e62c96bd1e55de7e098cfda9c98fbfe](https://github.com/dOpensource/dsiprouter/commit/f2a522d40e62c96bd1e55de7e098cfda9c98fbfe)  
> Date: Fri, 28 Mar 2025 16:03:43 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION f2a522d40e62c96bd1e55de7e098cfda9c98fbfe)
[//]: # (START_SECTION 92176ca0a908d5a778cb9a1081d7bd3a80df719c)
### WIP on SUBSCRIBE Interdomain Messaging

> Commit: [92176ca0a908d5a778cb9a1081d7bd3a80df719c](https://github.com/dOpensource/dsiprouter/commit/92176ca0a908d5a778cb9a1081d7bd3a80df719c)  
> Date: Wed, 12 Mar 2025 15:13:32 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   


- fix POSIX REGEX check on Contact
- remove non-useful domain code on PUBLISH


---

[//]: # (END_SECTION 92176ca0a908d5a778cb9a1081d7bd3a80df719c)
[//]: # (START_SECTION 50380c10d0fbeb07295d13cde20aa6ac0a221def)
### Fixes for Domain Routing Use Cases

> Commit: [50380c10d0fbeb07295d13cde20aa6ac0a221def](https://github.com/dOpensource/dsiprouter/commit/50380c10d0fbeb07295d13cde20aa6ac0a221def)  
> Date: Tue, 11 Mar 2025 14:25:41 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   


- resolves #622
- fix Contact on REGISTER, SUBSCRIBE, and PUBLISH
- use dispatcher routes for presence when a domain is matched


---

[//]: # (END_SECTION 50380c10d0fbeb07295d13cde20aa6ac0a221def)
[//]: # (START_SECTION e6cbcdbf74426a74a890a97cd5a1ef93813eda99)
### Fixed issues for MSTeams: - Fixed internal transfers - Fixed issue with hangups when initiated from the carrier side

> Commit: [e6cbcdbf74426a74a890a97cd5a1ef93813eda99](https://github.com/dOpensource/dsiprouter/commit/e6cbcdbf74426a74a890a97cd5a1ef93813eda99)  
> Date: Thu, 3 Apr 2025 09:10:31 -0400  
> Author: Mack Hendricks (mhendricks@sangoma.com)  
> Committer: Mack Hendricks (mhendricks@sangoma.com)  
> Signed:   




---

[//]: # (END_SECTION e6cbcdbf74426a74a890a97cd5a1ef93813eda99)
[//]: # (START_SECTION 14712ee1e39628bc178d8591e22d8fc6b355a21d)
### Trigger Jenkins build

> Commit: [14712ee1e39628bc178d8591e22d8fc6b355a21d](https://github.com/dOpensource/dsiprouter/commit/14712ee1e39628bc178d8591e22d8fc6b355a21d)  
> Date: Fri, 28 Mar 2025 14:36:48 -0400  
> Author: chelseatcarter (chelseatcarter@gmail.com)  
> Committer: chelseatcarter (chelseatcarter@gmail.com)  
> Signed:   




---

[//]: # (END_SECTION 14712ee1e39628bc178d8591e22d8fc6b355a21d)
[//]: # (START_SECTION 7a264c878a5440330ee03bccc501ea83c4fa33bb)
### Trigger Jenkins build

> Commit: [7a264c878a5440330ee03bccc501ea83c4fa33bb](https://github.com/dOpensource/dsiprouter/commit/7a264c878a5440330ee03bccc501ea83c4fa33bb)  
> Date: Fri, 28 Mar 2025 14:25:21 -0400  
> Author: chelseatcarter (chelseatcarter@gmail.com)  
> Committer: chelseatcarter (chelseatcarter@gmail.com)  
> Signed:   




---

[//]: # (END_SECTION 7a264c878a5440330ee03bccc501ea83c4fa33bb)
[//]: # (START_SECTION 2ab2a009610830601e70476cea99ec7d867ae181)
### Fixed Issues - REGISTER will now follow the signal settings in the endpoint group for domain routing.  Fixes #656 - Fixed an issue with the REPLACE_CONTACT_DOMAIN route, the semi-colon was missing in the protocal portion of the contact

> Commit: [2ab2a009610830601e70476cea99ec7d867ae181](https://github.com/dOpensource/dsiprouter/commit/2ab2a009610830601e70476cea99ec7d867ae181)  
> Date: Fri, 28 Mar 2025 16:03:43 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 2ab2a009610830601e70476cea99ec7d867ae181)
[//]: # (START_SECTION 36eb14bf4f109b1db9e11497f036f7768669a8bd)
### WIP on SUBSCRIBE Interdomain Messaging

> Commit: [36eb14bf4f109b1db9e11497f036f7768669a8bd](https://github.com/dOpensource/dsiprouter/commit/36eb14bf4f109b1db9e11497f036f7768669a8bd)  
> Date: Wed, 12 Mar 2025 15:13:32 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   


- fix POSIX REGEX check on Contact
- remove non-useful domain code on PUBLISH


---

[//]: # (END_SECTION 36eb14bf4f109b1db9e11497f036f7768669a8bd)
[//]: # (START_SECTION bda6aadd069dbdf2027b782e81a83af66e7e890a)
### Fixes for Domain Routing Use Cases

> Commit: [bda6aadd069dbdf2027b782e81a83af66e7e890a](https://github.com/dOpensource/dsiprouter/commit/bda6aadd069dbdf2027b782e81a83af66e7e890a)  
> Date: Tue, 11 Mar 2025 14:25:41 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   


- resolves #622
- fix Contact on REGISTER, SUBSCRIBE, and PUBLISH
- use dispatcher routes for presence when a domain is matched


---

[//]: # (END_SECTION bda6aadd069dbdf2027b782e81a83af66e7e890a)
[//]: # (START_SECTION 5d95510edf523ea0be6d417ff69360f77eb610e6)
### Fix DNSmasq Install for Debian

> Commit: [5d95510edf523ea0be6d417ff69360f77eb610e6](https://github.com/dOpensource/dsiprouter/commit/5d95510edf523ea0be6d417ff69360f77eb610e6)  
> Date: Wed, 5 Mar 2025 15:59:35 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  




---

[//]: # (END_SECTION 5d95510edf523ea0be6d417ff69360f77eb610e6)
[//]: # (START_SECTION 223522fe8e8011377b663409529bf04eb74cf1da)
### Fixes #646: Set a default value of 1 for rweight when an endpoint is created

> Commit: [223522fe8e8011377b663409529bf04eb74cf1da](https://github.com/dOpensource/dsiprouter/commit/223522fe8e8011377b663409529bf04eb74cf1da)  
> Date: Mon, 17 Mar 2025 23:15:18 +0000  
> Author: root (root@sbc1.customers.dsiprouter.net)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 223522fe8e8011377b663409529bf04eb74cf1da)
[//]: # (START_SECTION 96e17cb5f60b07b90c0f62639b5239e7e1e08873)
### Added DLGURI back into the config

> Commit: [96e17cb5f60b07b90c0f62639b5239e7e1e08873](https://github.com/dOpensource/dsiprouter/commit/96e17cb5f60b07b90c0f62639b5239e7e1e08873)  
> Date: Mon, 3 Mar 2025 23:17:28 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 96e17cb5f60b07b90c0f62639b5239e7e1e08873)
[//]: # (START_SECTION c9131b49277ad01931aa7fd19e56bf85a4b37e79)
### Revert "Removed duplicate route that was added in during merge from QA"

> Commit: [c9131b49277ad01931aa7fd19e56bf85a4b37e79](https://github.com/dOpensource/dsiprouter/commit/c9131b49277ad01931aa7fd19e56bf85a4b37e79)  
> Date: Mon, 3 Mar 2025 22:45:27 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   


- This reverts commit 4f23a2e1158d415856c027cc516069d4be7b0b2f.


---

[//]: # (END_SECTION c9131b49277ad01931aa7fd19e56bf85a4b37e79)
[//]: # (START_SECTION a106f645bebbd0f39f073f2dad55bf8ad5733463)
### Revert "Merge branch 'master' into qa"

> Commit: [a106f645bebbd0f39f073f2dad55bf8ad5733463](https://github.com/dOpensource/dsiprouter/commit/a106f645bebbd0f39f073f2dad55bf8ad5733463)  
> Date: Mon, 3 Mar 2025 22:38:45 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   


- This reverts commit ffbc368d783e83ae47809ef7cadad68e7496640f, reversing
- changes made to e8f8f8c07902241cd86428ab860dde834ba2977a.


---

[//]: # (END_SECTION a106f645bebbd0f39f073f2dad55bf8ad5733463)
[//]: # (START_SECTION 4f23a2e1158d415856c027cc516069d4be7b0b2f)
### Removed duplicate route that was added in during merge from QA

> Commit: [4f23a2e1158d415856c027cc516069d4be7b0b2f](https://github.com/dOpensource/dsiprouter/commit/4f23a2e1158d415856c027cc516069d4be7b0b2f)  
> Date: Sun, 2 Mar 2025 04:06:15 +0000  
> Author: root (root@demo.dsiprouter.net)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 4f23a2e1158d415856c027cc516069d4be7b0b2f)
[//]: # (START_SECTION 4859f366f289a1e8aa03d19fcb902cedba2129d7)
### Removed duplicate route that was added in during merge from QA

> Commit: [4859f366f289a1e8aa03d19fcb902cedba2129d7](https://github.com/dOpensource/dsiprouter/commit/4859f366f289a1e8aa03d19fcb902cedba2129d7)  
> Date: Sun, 2 Mar 2025 04:06:15 +0000  
> Author: root (root@demo.dsiprouter.net)  
> Committer: root (root@demo.dsiprouter.net)  
> Signed:   




---

[//]: # (END_SECTION 4859f366f289a1e8aa03d19fcb902cedba2129d7)
[//]: # (START_SECTION e8f8f8c07902241cd86428ab860dde834ba2977a)
### Resolves #633

> Commit: [e8f8f8c07902241cd86428ab860dde834ba2977a](https://github.com/dOpensource/dsiprouter/commit/e8f8f8c07902241cd86428ab860dde834ba2977a)  
> Date: Fri, 28 Feb 2025 20:14:40 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  




---

[//]: # (END_SECTION e8f8f8c07902241cd86428ab860dde834ba2977a)
[//]: # (START_SECTION 8c3d1ec2aec7952602f6c19af5d94648d272257a)
### PIDF-LO Support: - Fixed the Kamailio configuration so that SIP packets with PIDF-LO messages are properly re-written

> Commit: [8c3d1ec2aec7952602f6c19af5d94648d272257a](https://github.com/dOpensource/dsiprouter/commit/8c3d1ec2aec7952602f6c19af5d94648d272257a)  
> Date: Fri, 28 Feb 2025 14:12:28 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 8c3d1ec2aec7952602f6c19af5d94648d272257a)
[//]: # (START_SECTION ce9efc694149c243243e366d9303f12a6ff21090)
### Improved CDR Handling

> Commit: [ce9efc694149c243243e366d9303f12a6ff21090](https://github.com/dOpensource/dsiprouter/commit/ce9efc694149c243243e366d9303f12a6ff21090)  
> Date: Thu, 27 Feb 2025 16:37:35 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- add selector for billable calls
- move pagination to serverside
- move searching to serverside
- improve performance of queries
- update changelog


---

[//]: # (END_SECTION ce9efc694149c243243e366d9303f12a6ff21090)
[//]: # (START_SECTION a6690af4543a9458baf971404c7d21d03ec19bb3)
### Upgrade from 0.76 to 0.77 (#631)

> Commit: [a6690af4543a9458baf971404c7d21d03ec19bb3](https://github.com/dOpensource/dsiprouter/commit/a6690af4543a9458baf971404c7d21d03ec19bb3)  
> Date: Wed, 26 Feb 2025 17:08:49 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: GitHub (noreply@github.com)  
> Signed:   




---

[//]: # (END_SECTION a6690af4543a9458baf971404c7d21d03ec19bb3)
[//]: # (START_SECTION a89c77066094932562cb1aee1ade444c1335b02b)
### Fixes: - Removed the Microsoft Teams Subscriptions Link from Dashboard - Fixed the Teleblock Screen so that the Enable/Disable button works properly

> Commit: [a89c77066094932562cb1aee1ade444c1335b02b](https://github.com/dOpensource/dsiprouter/commit/a89c77066094932562cb1aee1ade444c1335b02b)  
> Date: Wed, 26 Feb 2025 11:48:01 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION a89c77066094932562cb1aee1ade444c1335b02b)
[//]: # (START_SECTION 16e7d16b9aaf5a230f1b4faa2ad032127befbe6e)
### Fixes: - Fixed BYE on non-MSTeams Calls - Fixed BYE on MSTeams to Carrier calls with the Carrier hanging up

> Commit: [16e7d16b9aaf5a230f1b4faa2ad032127befbe6e](https://github.com/dOpensource/dsiprouter/commit/16e7d16b9aaf5a230f1b4faa2ad032127befbe6e)  
> Date: Wed, 26 Feb 2025 11:44:39 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 16e7d16b9aaf5a230f1b4faa2ad032127befbe6e)
[//]: # (START_SECTION db26338c391f2b39463967f03ec2f123cc4c1f56)
### Upgrade from 0.76 to 0.77

> Commit: [db26338c391f2b39463967f03ec2f123cc4c1f56](https://github.com/dOpensource/dsiprouter/commit/db26338c391f2b39463967f03ec2f123cc4c1f56)  
> Date: Mon, 24 Feb 2025 10:54:49 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  




---

[//]: # (END_SECTION db26338c391f2b39463967f03ec2f123cc4c1f56)
[//]: # (START_SECTION ce3312c9020a8c1e208143ba51ae6ab19fb75fec)
### Fixed issue with the media type being copied to the other leg of the call when using MSTeams

> Commit: [ce3312c9020a8c1e208143ba51ae6ab19fb75fec](https://github.com/dOpensource/dsiprouter/commit/ce3312c9020a8c1e208143ba51ae6ab19fb75fec)  
> Date: Mon, 24 Feb 2025 23:02:53 +0000  
> Author: root (root@sbc1.customers.dsiprouter.net)  
> Committer: root (root@sbc1.customers.dsiprouter.net)  
> Signed:   




---

[//]: # (END_SECTION ce3312c9020a8c1e208143ba51ae6ab19fb75fec)
[//]: # (START_SECTION c7d98a3c26f298b4416fe27bb9ed6145a3eed3c3)
### Revert 02207a7

> Commit: [c7d98a3c26f298b4416fe27bb9ed6145a3eed3c3](https://github.com/dOpensource/dsiprouter/commit/c7d98a3c26f298b4416fe27bb9ed6145a3eed3c3)  
> Date: Mon, 24 Feb 2025 07:39:33 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- this was resolved in 2302d89


---

[//]: # (END_SECTION c7d98a3c26f298b4416fe27bb9ed6145a3eed3c3)
[//]: # (START_SECTION 77b0d03bf0c0ca0dcc9be4730aff129aaf2a0fca)
### Fixes: - Fixed the BYE for initial request from MSTeams to Carrier and from Carrier to MSTeams - Removed 2 Flowroute gateways from the DRouting Gateway List

> Commit: [77b0d03bf0c0ca0dcc9be4730aff129aaf2a0fca](https://github.com/dOpensource/dsiprouter/commit/77b0d03bf0c0ca0dcc9be4730aff129aaf2a0fca)  
> Date: Mon, 24 Feb 2025 04:45:10 +0000  
> Author: root (root@sbc1.customers.dsiprouter.net)  
> Committer: root (root@sbc1.customers.dsiprouter.net)  
> Signed:   




---

[//]: # (END_SECTION 77b0d03bf0c0ca0dcc9be4730aff129aaf2a0fca)
[//]: # (START_SECTION dd4564e01ccc4d5bd3ef101a1d1abf368771ce1e)
### Updated Flowroute POP's and configured the address table to allow inbound traffic from all Flowroute PoP's

> Commit: [dd4564e01ccc4d5bd3ef101a1d1abf368771ce1e](https://github.com/dOpensource/dsiprouter/commit/dd4564e01ccc4d5bd3ef101a1d1abf368771ce1e)  
> Date: Sun, 23 Feb 2025 22:54:01 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION dd4564e01ccc4d5bd3ef101a1d1abf368771ce1e)
[//]: # (START_SECTION 02207a75314811582d3895d35c2eabab968422e7)
### Added a fix to allow DigitalOcean Dropets to ignore the Internal IP address because the DO Networking doesn't NAT the address, which makes it not routable from the Internet

> Commit: [02207a75314811582d3895d35c2eabab968422e7](https://github.com/dOpensource/dsiprouter/commit/02207a75314811582d3895d35c2eabab968422e7)  
> Date: Sun, 23 Feb 2025 22:40:23 +0000  
> Author: root (root@sbc1.customers.dsiprouter.net)  
> Committer: root (root@sbc1.customers.dsiprouter.net)  
> Signed:   




---

[//]: # (END_SECTION 02207a75314811582d3895d35c2eabab968422e7)
[//]: # (START_SECTION 2302d89fd3752bbc6231f9e8131105a04a9f14ac)
### Revert dsip_lib.sh Internal Network Resolution

> Commit: [2302d89fd3752bbc6231f9e8131105a04a9f14ac](https://github.com/dOpensource/dsiprouter/commit/2302d89fd3752bbc6231f9e8131105a04a9f14ac)  
> Date: Fri, 21 Feb 2025 15:29:33 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  




---

[//]: # (END_SECTION 2302d89fd3752bbc6231f9e8131105a04a9f14ac)
[//]: # (START_SECTION f429ed2052552e1d8ea2c8182ce4825b1432a8e0)
### Revert "Feature/sbcsignalhandling"

> Commit: [f429ed2052552e1d8ea2c8182ce4825b1432a8e0](https://github.com/dOpensource/dsiprouter/commit/f429ed2052552e1d8ea2c8182ce4825b1432a8e0)  
> Date: Fri, 21 Feb 2025 16:16:54 -0500  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: GitHub (noreply@github.com)  
> Signed:   




---

[//]: # (END_SECTION f429ed2052552e1d8ea2c8182ce4825b1432a8e0)
[//]: # (START_SECTION 40eac0dbad1c95998ca0b5346187b47abceb1f95)
### Fixed issue(s) with MSTeams, which include: - Adding logic to improve REINVITES for MSTeam - Improved signal handling

> Commit: [40eac0dbad1c95998ca0b5346187b47abceb1f95](https://github.com/dOpensource/dsiprouter/commit/40eac0dbad1c95998ca0b5346187b47abceb1f95)  
> Date: Fri, 21 Feb 2025 21:12:04 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 40eac0dbad1c95998ca0b5346187b47abceb1f95)
[//]: # (START_SECTION 5a5f7558d67477c8b69dd1e23ac4f2ebc65ea2a3)
### Update DIDs When Exist On Import

> Commit: [5a5f7558d67477c8b69dd1e23ac4f2ebc65ea2a3](https://github.com/dOpensource/dsiprouter/commit/5a5f7558d67477c8b69dd1e23ac4f2ebc65ea2a3)  
> Date: Fri, 21 Feb 2025 11:10:17 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  




---

[//]: # (END_SECTION 5a5f7558d67477c8b69dd1e23ac4f2ebc65ea2a3)
[//]: # (START_SECTION 84d1f13d647cc2d7eeab523587435e9fb36b1688)
### Added logic to fix BYES

> Commit: [84d1f13d647cc2d7eeab523587435e9fb36b1688](https://github.com/dOpensource/dsiprouter/commit/84d1f13d647cc2d7eeab523587435e9fb36b1688)  
> Date: Fri, 21 Feb 2025 10:24:28 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 84d1f13d647cc2d7eeab523587435e9fb36b1688)
[//]: # (START_SECTION 1c0b86cc905d6c6a1aa4a11b89eb9361fdd97907)
### Added port-latch parameter to RTPEngine flags

> Commit: [1c0b86cc905d6c6a1aa4a11b89eb9361fdd97907](https://github.com/dOpensource/dsiprouter/commit/1c0b86cc905d6c6a1aa4a11b89eb9361fdd97907)  
> Date: Thu, 20 Feb 2025 22:17:10 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 1c0b86cc905d6c6a1aa4a11b89eb9361fdd97907)
[//]: # (START_SECTION 2fab7686d38b88730594a8cd57d25eaf88076cbb)
### Fix Typo WITH_CDRS

> Commit: [2fab7686d38b88730594a8cd57d25eaf88076cbb](https://github.com/dOpensource/dsiprouter/commit/2fab7686d38b88730594a8cd57d25eaf88076cbb)  
> Date: Wed, 12 Feb 2025 12:17:14 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 2fab7686d38b88730594a8cd57d25eaf88076cbb)
[//]: # (START_SECTION e1c2bd0628d34c0e32c48d7645810d29d9296718)
### Latest Progress on Translations

> Commit: [e1c2bd0628d34c0e32c48d7645810d29d9296718](https://github.com/dOpensource/dsiprouter/commit/e1c2bd0628d34c0e32c48d7645810d29d9296718)  
> Date: Fri, 31 Jan 2025 12:51:08 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION e1c2bd0628d34c0e32c48d7645810d29d9296718)
[//]: # (START_SECTION db746a1ef367383edbc0896f52f31ef82f3e0439)
### Fix Missing ftag

> Commit: [db746a1ef367383edbc0896f52f31ef82f3e0439](https://github.com/dOpensource/dsiprouter/commit/db746a1ef367383edbc0896f52f31ef82f3e0439)  
> Date: Fri, 27 Sep 2024 10:15:47 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   


- fix missing tag in From after SBC translations


---

[//]: # (END_SECTION db746a1ef367383edbc0896f52f31ef82f3e0439)
[//]: # (START_SECTION ad5f92b9896911a020caa3971dd9b0a01ea56164)
### Better Call Teardown

> Commit: [ad5f92b9896911a020caa3971dd9b0a01ea56164](https://github.com/dOpensource/dsiprouter/commit/ad5f92b9896911a020caa3971dd9b0a01ea56164)  
> Date: Thu, 19 Sep 2024 17:36:29 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   


- update cfg to ensure rtpengine sessions are always torn down immediately
- fix dlg_ctx parameters not being applied to dialog


---

[//]: # (END_SECTION ad5f92b9896911a020caa3971dd9b0a01ea56164)
[//]: # (START_SECTION 9c19f242e8a7ad0196f88a2078e0be061ca16cbf)
### Fix Endpoint Group Call Limit

> Commit: [9c19f242e8a7ad0196f88a2078e0be061ca16cbf](https://github.com/dOpensource/dsiprouter/commit/9c19f242e8a7ad0196f88a2078e0be061ca16cbf)  
> Date: Wed, 18 Sep 2024 16:22:18 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   


- fix in dialog requests forgetting gwid/gwgroupid


---

[//]: # (END_SECTION 9c19f242e8a7ad0196f88a2078e0be061ca16cbf)
[//]: # (START_SECTION 4ce5a4a0d4125defd1fe11046d72efe8e10b42f0)
### Handle Null Request Username

> Commit: [4ce5a4a0d4125defd1fe11046d72efe8e10b42f0](https://github.com/dOpensource/dsiprouter/commit/4ce5a4a0d4125defd1fe11046d72efe8e10b42f0)  
> Date: Wed, 11 Sep 2024 10:45:09 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   


- default null req username to To username to support non-compliant UACs


---

[//]: # (END_SECTION 4ce5a4a0d4125defd1fe11046d72efe8e10b42f0)
[//]: # (START_SECTION db53233a086170ff69b829ab1a203ce78d404a36)
### Added MSTeams Fixes and SBC Signaling Handling - Cherry Picked 52e5931 - Added Logic to Fix MSTeams

> Commit: [db53233a086170ff69b829ab1a203ce78d404a36](https://github.com/dOpensource/dsiprouter/commit/db53233a086170ff69b829ab1a203ce78d404a36)  
> Date: Sun, 16 Feb 2025 22:01:33 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION db53233a086170ff69b829ab1a203ce78d404a36)
[//]: # (START_SECTION 582aa4c755a129dbaf30fa951232bcfc6b174c48)
### Improved SBC Signal Handling

> Commit: [582aa4c755a129dbaf30fa951232bcfc6b174c48](https://github.com/dOpensource/dsiprouter/commit/582aa4c755a129dbaf30fa951232bcfc6b174c48)  
> Date: Wed, 28 Aug 2024 09:45:33 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   


- handle the translation between A and B leg signalling within every dialog
- update in dialog requests back to UA to use the Contact they initiated call with
- fix dialog tracking not matching properly
- fix To number not reformatted when drouting strips from the request URI


---

[//]: # (END_SECTION 582aa4c755a129dbaf30fa951232bcfc6b174c48)
[//]: # (START_SECTION 029833e37ba7c808c64a2062836edfffb0bf87af)
### Fixed typo

> Commit: [029833e37ba7c808c64a2062836edfffb0bf87af](https://github.com/dOpensource/dsiprouter/commit/029833e37ba7c808c64a2062836edfffb0bf87af)  
> Date: Wed, 12 Feb 2025 20:53:34 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 029833e37ba7c808c64a2062836edfffb0bf87af)
[//]: # (START_SECTION 96ae8e0ad6b59ffcfa5eb5e22071ef01cda3b386)
### Fixed Carrier to MSTeams call flow with audio working properly.  Hanging the call up from the carrier sends a proper BYE to MSTeams

> Commit: [96ae8e0ad6b59ffcfa5eb5e22071ef01cda3b386](https://github.com/dOpensource/dsiprouter/commit/96ae8e0ad6b59ffcfa5eb5e22071ef01cda3b386)  
> Date: Wed, 12 Feb 2025 05:14:37 +0000  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: Mack Hendricks (mack@dopensource.com)  
> Signed:   




---

[//]: # (END_SECTION 96ae8e0ad6b59ffcfa5eb5e22071ef01cda3b386)
[//]: # (START_SECTION 4c603fe4465e0777bc9ab83f138b24bdc790857c)
### Fix Backup and Restore Feature

> Commit: [4c603fe4465e0777bc9ab83f138b24bdc790857c](https://github.com/dOpensource/dsiprouter/commit/4c603fe4465e0777bc9ab83f138b24bdc790857c)  
> Date: Mon, 3 Feb 2025 06:10:13 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- use root DB creds for backup/restore
- add backup/restore subcmmands to CLI
- add new subcommands to sudoers
- add CLI completion for new subcommands
- add docs for new subcommands
- allow backup / restore with DB proxy auth
- update API to use CLI interface for backup/restore
- fixup browser history / links in backup code path
- add loading spinner to backup/restore features


---

[//]: # (END_SECTION 4c603fe4465e0777bc9ab83f138b24bdc790857c)
[//]: # (START_SECTION 9e3fba57211e2d32b1d4cc2abca9d0212e23cc6f)
### Fixed #591 - Fixed the backup so that it excluded database views - Added logic to propagate mysql errors when trying to perform a restore

> Commit: [9e3fba57211e2d32b1d4cc2abca9d0212e23cc6f](https://github.com/dOpensource/dsiprouter/commit/9e3fba57211e2d32b1d4cc2abca9d0212e23cc6f)  
> Date: Mon, 2 Sep 2024 03:47:32 +0000  
> Author: root (root@ip-172-31-13-77)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   




---

[//]: # (END_SECTION 9e3fba57211e2d32b1d4cc2abca9d0212e23cc6f)
[//]: # (START_SECTION 4fadad93e3aa6411e567a424759a451d053f9a58)
### Resolves #602

> Commit: [4fadad93e3aa6411e567a424759a451d053f9a58](https://github.com/dOpensource/dsiprouter/commit/4fadad93e3aa6411e567a424759a451d053f9a58)  
> Date: Thu, 30 Jan 2025 11:08:07 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- fix fall through condition when building regex for epg dispatcher query


---

[//]: # (END_SECTION 4fadad93e3aa6411e567a424759a451d053f9a58)
[//]: # (START_SECTION b4c5011cba0f5d39566336fd926158c4c0bcfa3a)
### Bump jinja2 from 3.1.2 to 3.1.3 in /docs

> Commit: [b4c5011cba0f5d39566336fd926158c4c0bcfa3a](https://github.com/dOpensource/dsiprouter/commit/b4c5011cba0f5d39566336fd926158c4c0bcfa3a)  
> Date: Thu, 11 Jan 2024 21:44:15 +0000  
> Author: dependabot[bot] (49699333+dependabot[bot]@users.noreply.github.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3.
- - [Release notes](https://github.com/pallets/jinja/releases)
- - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3)
- ---
- updated-dependencies:
- - dependency-name: jinja2
- dependency-type: indirect
- ...
- Signed-off-by: dependabot[bot] <support@github.com>


---

[//]: # (END_SECTION b4c5011cba0f5d39566336fd926158c4c0bcfa3a)
[//]: # (START_SECTION 9d1a14335d324a834625d1e922c8de2d4057b649)
### Bump jinja2 from 3.0.3 to 3.1.3 in /gui

> Commit: [9d1a14335d324a834625d1e922c8de2d4057b649](https://github.com/dOpensource/dsiprouter/commit/9d1a14335d324a834625d1e922c8de2d4057b649)  
> Date: Thu, 11 Jan 2024 19:21:16 +0000  
> Author: dependabot[bot] (49699333+dependabot[bot]@users.noreply.github.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- Bumps [jinja2](https://github.com/pallets/jinja) from 3.0.3 to 3.1.3.
- - [Release notes](https://github.com/pallets/jinja/releases)
- - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- - [Commits](https://github.com/pallets/jinja/compare/3.0.3...3.1.3)
- ---
- updated-dependencies:
- - dependency-name: jinja2
- dependency-type: direct:production
- ...
- Signed-off-by: dependabot[bot] <support@github.com>


---

[//]: # (END_SECTION 9d1a14335d324a834625d1e922c8de2d4057b649)
[//]: # (START_SECTION 103bc6e4a3c22b37c1f52bdfa79e48d90dd86e2e)
### Fix Standalone Run of generateCDRS()

> Commit: [103bc6e4a3c22b37c1f52bdfa79e48d90dd86e2e](https://github.com/dOpensource/dsiprouter/commit/103bc6e4a3c22b37c1f52bdfa79e48d90dd86e2e)  
> Date: Mon, 20 Jan 2025 09:23:26 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   




---

[//]: # (END_SECTION 103bc6e4a3c22b37c1f52bdfa79e48d90dd86e2e)
[//]: # (START_SECTION ba663bd3cc3c16f7c33c8f7977e1b4d5051efc0d)
### Cronjob Edge Cases

> Commit: [ba663bd3cc3c16f7c33c8f7977e1b4d5051efc0d](https://github.com/dOpensource/dsiprouter/commit/ba663bd3cc3c16f7c33c8f7977e1b4d5051efc0d)  
> Date: Wed, 28 Aug 2024 09:10:25 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- detect if CDR cron entry missing on update and add it
- update default python paths to venv on shebang lines


---

[//]: # (END_SECTION ba663bd3cc3c16f7c33c8f7977e1b4d5051efc0d)
[//]: # (START_SECTION 41a1a512aba83310e57d6c2c4d6e19a35a633900)
### Set Defaults For restart

> Commit: [41a1a512aba83310e57d6c2c4d6e19a35a633900](https://github.com/dOpensource/dsiprouter/commit/41a1a512aba83310e57d6c2c4d6e19a35a633900)  
> Date: Fri, 17 Jan 2025 11:27:41 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- give `RESTART_DAEMONIZE` a default value so the func is more reusable


---

[//]: # (END_SECTION 41a1a512aba83310e57d6c2c4d6e19a35a633900)
[//]: # (START_SECTION 325b4c18db320c491021681490d1bc364524b000)
### Networking Updates

> Commit: [325b4c18db320c491021681490d1bc364524b000](https://github.com/dOpensource/dsiprouter/commit/325b4c18db320c491021681490d1bc364524b000)  
> Date: Wed, 15 Jan 2025 14:40:57 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- fix dsip-net-cfg reverted when system network mgmt service reloads
- improve output / parsing of `-debug` options
- fix swapfile not written in fstab
- fix null returned when no default route in `getInternalIP()`
- fix comment typo in debian install script


---

[//]: # (END_SECTION 325b4c18db320c491021681490d1bc364524b000)
[//]: # (START_SECTION 5edf7567a52854a403c21b66c785c4a529b8dd7e)
### Fix Some Dependent Sequencing

> Commit: [5edf7567a52854a403c21b66c785c4a529b8dd7e](https://github.com/dOpensource/dsiprouter/commit/5edf7567a52854a403c21b66c785c4a529b8dd7e)  
> Date: Tue, 14 Jan 2025 11:40:39 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- move system path config to `install` / `uninstall` subcommands
- move `setStaticScriptSettings()` up before funcs expecting dsip config dir


---

[//]: # (END_SECTION 5edf7567a52854a403c21b66c785c4a529b8dd7e)
[//]: # (START_SECTION 472c343c957240dcebe500f405e3d818fd65f6fc)
### Dynamic Network Mode Improvements

> Commit: [472c343c957240dcebe500f405e3d818fd65f6fc](https://github.com/dOpensource/dsiprouter/commit/472c343c957240dcebe500f405e3d818fd65f6fc)  
> Date: Wed, 8 Jan 2025 12:05:33 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- improve IP selection algo for internal addresses
- make floating IP the default route on supported deployments
- add hook in dsip-init for network updates prior cfg updates


---

[//]: # (END_SECTION 472c343c957240dcebe500f405e3d818fd65f6fc)
[//]: # (START_SECTION 3400b7d680e252f1b193294c24385740e0ea4cf9)
### Fix Call Settings Htable

> Commit: [3400b7d680e252f1b193294c24385740e0ea4cf9](https://github.com/dOpensource/dsiprouter/commit/3400b7d680e252f1b193294c24385740e0ea4cf9)  
> Date: Wed, 11 Sep 2024 07:30:08 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- fix issue where call settings htable would not load
- remove unused drouting htable and replace with prefix_to_route


---

[//]: # (END_SECTION 3400b7d680e252f1b193294c24385740e0ea4cf9)
[//]: # (START_SECTION 6bfcbbe3ccc56fef2378e7d1305751318ac508e6)
### Fix Concurrent Call Limits

> Commit: [6bfcbbe3ccc56fef2378e7d1305751318ac508e6](https://github.com/dOpensource/dsiprouter/commit/6bfcbbe3ccc56fef2378e7d1305751318ac508e6)  
> Date: Mon, 6 Jan 2025 15:04:59 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- use dialog var so dialog event routes can access the src/dst gwgroupid


---

[//]: # (END_SECTION 6bfcbbe3ccc56fef2378e7d1305751318ac508e6)
[//]: # (START_SECTION 8a9eefe4814db0d20e6d5030f6e9865f47711513)
### Fix CloudInit Networking

> Commit: [8a9eefe4814db0d20e6d5030f6e9865f47711513](https://github.com/dOpensource/dsiprouter/commit/8a9eefe4814db0d20e6d5030f6e9865f47711513)  
> Date: Thu, 3 Oct 2024 09:24:55 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- fix images created from instances failing to configure new ifaces


---

[//]: # (END_SECTION 8a9eefe4814db0d20e6d5030f6e9865f47711513)
[//]: # (START_SECTION 5737d1f33c99de90e0ef9188ca6c840292896567)
### Fix Apt Variable Sequencing

> Commit: [5737d1f33c99de90e0ef9188ca6c840292896567](https://github.com/dOpensource/dsiprouter/commit/5737d1f33c99de90e0ef9188ca6c840292896567)  
> Date: Tue, 14 Jan 2025 10:42:59 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- move the APT config variables into `setStaticScriptSettings()`


---

[//]: # (END_SECTION 5737d1f33c99de90e0ef9188ca6c840292896567)
[//]: # (START_SECTION cced1d2cd835ca6d546a22b78dcc6d46f2c1a874)
### Fix TLS Cert Renewal Check

> Commit: [cced1d2cd835ca6d546a22b78dcc6d46f2c1a874](https://github.com/dOpensource/dsiprouter/commit/cced1d2cd835ca6d546a22b78dcc6d46f2c1a874)  
> Date: Thu, 21 Nov 2024 12:22:11 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- fix typo in cli function


---

[//]: # (END_SECTION cced1d2cd835ca6d546a22b78dcc6d46f2c1a874)
[//]: # (START_SECTION 357eca71bf3767d10f36b6e2db1249048a399c54)
### Backport UltraDict Build Fix to Debian-based OS

> Commit: [357eca71bf3767d10f36b6e2db1249048a399c54](https://github.com/dOpensource/dsiprouter/commit/357eca71bf3767d10f36b6e2db1249048a399c54)  
> Date: Mon, 13 Jan 2025 10:25:40 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  




---

[//]: # (END_SECTION 357eca71bf3767d10f36b6e2db1249048a399c54)
[//]: # (START_SECTION cd0db1a1f6bf45e09e31ff56e6e3541bd617ea70)
### Debian12 UltraDict Dependency Fix

> Commit: [cd0db1a1f6bf45e09e31ff56e6e3541bd617ea70](https://github.com/dOpensource/dsiprouter/commit/cd0db1a1f6bf45e09e31ff56e6e3541bd617ea70)  
> Date: Fri, 8 Nov 2024 13:50:00 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- run UltraDict install separate to workaround hanging install


---

[//]: # (END_SECTION cd0db1a1f6bf45e09e31ff56e6e3541bd617ea70)
[//]: # (START_SECTION 8b79cd5e57ee370fe39d8d2234b995c7a0c3667f)
### Backport UltraDict Build Fix to Debian-based OS

> Commit: [8b79cd5e57ee370fe39d8d2234b995c7a0c3667f](https://github.com/dOpensource/dsiprouter/commit/8b79cd5e57ee370fe39d8d2234b995c7a0c3667f)  
> Date: Mon, 13 Jan 2025 10:25:40 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  




---

[//]: # (END_SECTION 8b79cd5e57ee370fe39d8d2234b995c7a0c3667f)
[//]: # (START_SECTION 435b3cadb5cdc837343d12c04199ef58ecc88123)
### Fix Libjwt / Libstirshaken Builds

> Commit: [435b3cadb5cdc837343d12c04199ef58ecc88123](https://github.com/dOpensource/dsiprouter/commit/435b3cadb5cdc837343d12c04199ef58ecc88123)  
> Date: Mon, 13 Jan 2025 09:57:12 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- fix build for debian-based systems
- pin libjwt to 2.1.1


---

[//]: # (END_SECTION 435b3cadb5cdc837343d12c04199ef58ecc88123)
[//]: # (START_SECTION ec09a74859312f30a48ec11dd57ed682f4da3868)
### OS Support Updates

> Commit: [ec09a74859312f30a48ec11dd57ed682f4da3868](https://github.com/dOpensource/dsiprouter/commit/ec09a74859312f30a48ec11dd57ed682f4da3868)  
> Date: Tue, 19 Nov 2024 14:23:43 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- centos7 --> deprecated
- centos9 stability fixes
- rhel9 --> alpha
- rhel8 --> beta
- alma8 --> alpha
- alma8 --> beta
- rocky9 --> alpha
- rocky8 --> beta
- ubuntu 24.04  --> beta
- debian 10/11/12 pinned kamailio to 5.8.3
- debian 9 pinned kamailio to 5.5.7
- centos 8/9 pinned kamailio to 5.8.3
- centos7 pinned kamailio to 5.7.6
- amazn2 pinned kamailo to 5.7.6
- ubuntu 24.04 pinned kamailio to 5.8.4 / rtpengine to mr11.5.1.11
- ubuntu 22.04 pinned kamailio to 5.8.3 / rtpengine to mr11.5.1.11
- ubuntu 20.04 pinned kamailio to 5.8.3
- rhel8/9 pinned kamailio to 5.8.3
- alma 8/9 pinned kamalio to 5.8.3 / rtpengine to mr11.5.1.11
- rocky 8/9 pinned kamalio to 5.8.3 / rtpengine to mr11.5.1.11
- add back in swap file for low memory systems (2GB)
- update OS support in docs
- fix `RTPENGINE_URI` missing from `dsip_settings` python interfaces


---

[//]: # (END_SECTION ec09a74859312f30a48ec11dd57ed682f4da3868)
[//]: # (START_SECTION edc1122b046b2948c5ccff28940693c0dcae2821)
### Debian12 UltraDict Dependency Fix

> Commit: [edc1122b046b2948c5ccff28940693c0dcae2821](https://github.com/dOpensource/dsiprouter/commit/edc1122b046b2948c5ccff28940693c0dcae2821)  
> Date: Fri, 8 Nov 2024 13:50:00 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- run UltraDict install separate to workaround hanging install


---

[//]: # (END_SECTION edc1122b046b2948c5ccff28940693c0dcae2821)
[//]: # (START_SECTION deb523e80b4f468c47b0f56e89480b8d19b2c899)
### Fix isHostLocal Matching Pattern

> Commit: [deb523e80b4f468c47b0f56e89480b8d19b2c899](https://github.com/dOpensource/dsiprouter/commit/deb523e80b4f468c47b0f56e89480b8d19b2c899)  
> Date: Thu, 31 Oct 2024 14:15:02 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  




---

[//]: # (END_SECTION deb523e80b4f468c47b0f56e89480b8d19b2c899)
[//]: # (START_SECTION 2e52b3173dc0bfec031da450adc0bc06ff51dab2)
### Support Remote RTPEngine Media Server

> Commit: [2e52b3173dc0bfec031da450adc0bc06ff51dab2](https://github.com/dOpensource/dsiprouter/commit/2e52b3173dc0bfec031da450adc0bc06ff51dab2)  
> Date: Tue, 24 Sep 2024 18:48:30 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- add support for media proxy through a remote RTPEngine instance
- add capability for rtpengine service to be dynamically disabled
- update RHEL-based distros rtpengine installs
- add CLI option `--rtpengine-uri=` to `install` subcommand
- improve local host check for services that can be either remote or local


---

[//]: # (END_SECTION 2e52b3173dc0bfec031da450adc0bc06ff51dab2)
[//]: # (START_SECTION 2d2491605e0912a54a66a6e141b5f093120f6ee6)
### Fix HEP Port Not Set In Some Cases

> Commit: [2d2491605e0912a54a66a6e141b5f093120f6ee6](https://github.com/dOpensource/dsiprouter/commit/2d2491605e0912a54a66a6e141b5f093120f6ee6)  
> Date: Fri, 20 Sep 2024 13:12:18 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- remove HEP port from static variables in CLI
- make dynamic lookups for homer variables more reliable


---

[//]: # (END_SECTION 2d2491605e0912a54a66a6e141b5f093120f6ee6)
[//]: # (START_SECTION abc7359613387ce22dc82a1f8bf9a336835f505e)
### Fix Homer Updates in RTPEngine Config

> Commit: [abc7359613387ce22dc82a1f8bf9a336835f505e](https://github.com/dOpensource/dsiprouter/commit/abc7359613387ce22dc82a1f8bf9a336835f505e)  
> Date: Wed, 11 Sep 2024 16:04:29 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- get default values from `settings.py` when running `dsiprouter updatertpconfig`


---

[//]: # (END_SECTION abc7359613387ce22dc82a1f8bf9a336835f505e)
[//]: # (START_SECTION fe0127248147c98388771c02900afa45c17eb565)
### Compartmentalize Mysql Portion of Installation

> Commit: [fe0127248147c98388771c02900afa45c17eb565](https://github.com/dOpensource/dsiprouter/commit/fe0127248147c98388771c02900afa45c17eb565)  
> Date: Sun, 11 Aug 2024 11:41:39 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- mariadb server now installs with `-all` or explicitly with `-mysql`
- move dev/lib package installs to the rtpengine installation scripts


---

[//]: # (END_SECTION fe0127248147c98388771c02900afa45c17eb565)
[//]: # (START_SECTION f8aecea6bd3c217b2073234c9f6ba3fae4c4e5f8)
### Allow External RTPEngine to be Configured

> Commit: [f8aecea6bd3c217b2073234c9f6ba3fae4c4e5f8](https://github.com/dOpensource/dsiprouter/commit/f8aecea6bd3c217b2073234c9f6ba3fae4c4e5f8)  
> Date: Sun, 11 Aug 2024 13:16:48 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- add support for specifying remote rtpengine uri during install
- add settings to allow changing the above later on
- fix typos in `dsip_lib.sh`
- update DB URI parsing func to not rely on system python


---

[//]: # (END_SECTION f8aecea6bd3c217b2073234c9f6ba3fae4c4e5f8)
[//]: # (START_SECTION 4bae4f3d0153a244c1441213327a83884547ea96)
### Fix HA Script Not Removing init Commands

> Commit: [4bae4f3d0153a244c1441213327a83884547ea96](https://github.com/dOpensource/dsiprouter/commit/4bae4f3d0153a244c1441213327a83884547ea96)  
> Date: Sun, 11 Aug 2024 13:23:43 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  




---

[//]: # (END_SECTION 4bae4f3d0153a244c1441213327a83884547ea96)
[//]: # (START_SECTION f833e8374efecbc4a9319251db9941f68f331617)
### Allow Python Selection for hashCreds()

> Commit: [f833e8374efecbc4a9319251db9941f68f331617](https://github.com/dOpensource/dsiprouter/commit/f833e8374efecbc4a9319251db9941f68f331617)  
> Date: Mon, 12 Aug 2024 07:10:46 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- this will allow us to remove the system python package after installation


---

[//]: # (END_SECTION f833e8374efecbc4a9319251db9941f68f331617)
[//]: # (START_SECTION 17084e4bb069807f065f847086b5b002ff4d54ed)
### Fixed LibJWT: - Missed adding install as a command to make

> Commit: [17084e4bb069807f065f847086b5b002ff4d54ed](https://github.com/dOpensource/dsiprouter/commit/17084e4bb069807f065f847086b5b002ff4d54ed)  
> Date: Sat, 4 Jan 2025 01:32:21 +0000  
> Author: root (root@demo.dsiprouter.net)  
> Committer: root (root@demo.dsiprouter.net)  
> Signed:   




---

[//]: # (END_SECTION 17084e4bb069807f065f847086b5b002ff4d54ed)
[//]: # (START_SECTION fea919d0b4f5184c4ae2d319ed39cfdfb1e3a1dd)
### Fix LibJWT: The LibJWT build system switched over to cmake from autoconf so Kamailio install script had to be updated

> Commit: [fea919d0b4f5184c4ae2d319ed39cfdfb1e3a1dd](https://github.com/dOpensource/dsiprouter/commit/fea919d0b4f5184c4ae2d319ed39cfdfb1e3a1dd)  
> Date: Fri, 3 Jan 2025 23:52:26 +0000  
> Author: root (root@demo.dsiprouter.net)  
> Committer: root (root@demo.dsiprouter.net)  
> Signed:   




---

[//]: # (END_SECTION fea919d0b4f5184c4ae2d319ed39cfdfb1e3a1dd)
[//]: # (START_SECTION 351dc8ef45d4f09072584b1b906bc0b04973df8d)
### Fix libjwt Not Compiling

> Commit: [351dc8ef45d4f09072584b1b906bc0b04973df8d](https://github.com/dOpensource/dsiprouter/commit/351dc8ef45d4f09072584b1b906bc0b04973df8d)  
> Date: Wed, 18 Dec 2024 12:56:49 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  




---

[//]: # (END_SECTION 351dc8ef45d4f09072584b1b906bc0b04973df8d)
[//]: # (START_SECTION bda08eb49639f20e85563131cc2356770eaea61f)
### Stabilize Flux Capacitors

> Commit: [bda08eb49639f20e85563131cc2356770eaea61f](https://github.com/dOpensource/dsiprouter/commit/bda08eb49639f20e85563131cc2356770eaea61f)  
> Date: Mon, 25 Nov 2024 17:05:43 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- rhel9 --> STABLE
- rhel9: bump rtpengine version to mr11.5.1.11
- alma9 --> STABLE
- rocky9 --> STABLE
- ubuntu 24.04 --> STABLE
- rhel9/alma9/rocky9/centos9 update to use dsiprouter-repo instead of rpmfusion


---

[//]: # (END_SECTION bda08eb49639f20e85563131cc2356770eaea61f)
[//]: # (START_SECTION 3408b9a6c8d68a473bb2b7a53ec31ceff6900f91)
### OS Support Updates

> Commit: [3408b9a6c8d68a473bb2b7a53ec31ceff6900f91](https://github.com/dOpensource/dsiprouter/commit/3408b9a6c8d68a473bb2b7a53ec31ceff6900f91)  
> Date: Tue, 19 Nov 2024 14:23:43 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- centos7 --> deprecated
- centos9 stability fixes
- rhel9 --> alpha
- rhel8 --> beta
- alma8 --> alpha
- alma8 --> beta
- rocky9 --> alpha
- rocky8 --> beta
- ubuntu 24.04  --> beta
- debian 10/11/12 pinned kamailio to 5.8.3
- debian 9 pinned kamailio to 5.5.7
- centos 8/9 pinned kamailio to 5.8.3
- centos7 pinned kamailio to 5.7.6
- amazn2 pinned kamailo to 5.7.6
- ubuntu 24.04 pinned kamailio to 5.8.4 / rtpengine to mr11.5.1.11
- ubuntu 22.04 pinned kamailio to 5.8.3 / rtpengine to mr11.5.1.11
- ubuntu 20.04 pinned kamailio to 5.8.3
- rhel8/9 pinned kamailio to 5.8.3
- alma 8/9 pinned kamalio to 5.8.3 / rtpengine to mr11.5.1.11
- rocky 8/9 pinned kamalio to 5.8.3 / rtpengine to mr11.5.1.11
- add back in swap file for low memory systems (2GB)
- update OS support in docs
- fix `RTPENGINE_URI` missing from `dsip_settings` python interfaces


---

[//]: # (END_SECTION 3408b9a6c8d68a473bb2b7a53ec31ceff6900f91)
[//]: # (START_SECTION 014c30de6ac92ab9ca51e758b74c8563a875d98b)
### Debian12 UltraDict Dependency Fix

> Commit: [014c30de6ac92ab9ca51e758b74c8563a875d98b](https://github.com/dOpensource/dsiprouter/commit/014c30de6ac92ab9ca51e758b74c8563a875d98b)  
> Date: Fri, 8 Nov 2024 13:50:00 -0700  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- run UltraDict install separate to workaround hanging install


---

[//]: # (END_SECTION 014c30de6ac92ab9ca51e758b74c8563a875d98b)
[//]: # (START_SECTION b46462ea5d8160b69a7999de6116f0b2aa0c42ed)
### Fix isHostLocal Matching Pattern

> Commit: [b46462ea5d8160b69a7999de6116f0b2aa0c42ed](https://github.com/dOpensource/dsiprouter/commit/b46462ea5d8160b69a7999de6116f0b2aa0c42ed)  
> Date: Thu, 31 Oct 2024 14:15:02 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   




---

[//]: # (END_SECTION b46462ea5d8160b69a7999de6116f0b2aa0c42ed)
[//]: # (START_SECTION 1c46e8cd1d1cf82cced662b3e6af94b667c77ac9)
### Support Remote RTPEngine Media Server

> Commit: [1c46e8cd1d1cf82cced662b3e6af94b667c77ac9](https://github.com/dOpensource/dsiprouter/commit/1c46e8cd1d1cf82cced662b3e6af94b667c77ac9)  
> Date: Tue, 24 Sep 2024 18:48:30 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- add support for media proxy through a remote RTPEngine instance
- add capability for rtpengine service to be dynamically disabled
- update RHEL-based distros rtpengine installs
- add CLI option `--rtpengine-uri=` to `install` subcommand
- improve local host check for services that can be either remote or local


---

[//]: # (END_SECTION 1c46e8cd1d1cf82cced662b3e6af94b667c77ac9)
[//]: # (START_SECTION dcf2b437e94bf987e60d1c16bf85b331de1ff592)
### Fix HEP Port Not Set In Some Cases

> Commit: [dcf2b437e94bf987e60d1c16bf85b331de1ff592](https://github.com/dOpensource/dsiprouter/commit/dcf2b437e94bf987e60d1c16bf85b331de1ff592)  
> Date: Fri, 20 Sep 2024 13:12:18 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- remove HEP port from static variables in CLI
- make dynamic lookups for homer variables more reliable


---

[//]: # (END_SECTION dcf2b437e94bf987e60d1c16bf85b331de1ff592)
[//]: # (START_SECTION f0ac44f8041b10a3675f5a2accfe29199a795990)
### Fix Homer Updates in RTPEngine Config

> Commit: [f0ac44f8041b10a3675f5a2accfe29199a795990](https://github.com/dOpensource/dsiprouter/commit/f0ac44f8041b10a3675f5a2accfe29199a795990)  
> Date: Wed, 11 Sep 2024 16:04:29 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- get default values from `settings.py` when running `dsiprouter updatertpconfig`


---

[//]: # (END_SECTION f0ac44f8041b10a3675f5a2accfe29199a795990)
[//]: # (START_SECTION 482bd41f6d5bc599e632c76095c3f0ea09ee7712)
### Compartmentalize Mysql Portion of Installation

> Commit: [482bd41f6d5bc599e632c76095c3f0ea09ee7712](https://github.com/dOpensource/dsiprouter/commit/482bd41f6d5bc599e632c76095c3f0ea09ee7712)  
> Date: Sun, 11 Aug 2024 11:41:39 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- mariadb server now installs with `-all` or explicitly with `-mysql`
- move dev/lib package installs to the rtpengine installation scripts


---

[//]: # (END_SECTION 482bd41f6d5bc599e632c76095c3f0ea09ee7712)
[//]: # (START_SECTION 559fec30e82c5553b483acfe7c59d801d65cfd5d)
### Allow External RTPEngine to be Configured

> Commit: [559fec30e82c5553b483acfe7c59d801d65cfd5d](https://github.com/dOpensource/dsiprouter/commit/559fec30e82c5553b483acfe7c59d801d65cfd5d)  
> Date: Sun, 11 Aug 2024 13:16:48 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- add support for specifying remote rtpengine uri during install
- add settings to allow changing the above later on
- fix typos in `dsip_lib.sh`
- update DB URI parsing func to not rely on system python


---

[//]: # (END_SECTION 559fec30e82c5553b483acfe7c59d801d65cfd5d)
[//]: # (START_SECTION d2f71046f6eb8b7dabc13cbb88b74d530d686367)
### Fix HA Script Not Removing init Commands

> Commit: [d2f71046f6eb8b7dabc13cbb88b74d530d686367](https://github.com/dOpensource/dsiprouter/commit/d2f71046f6eb8b7dabc13cbb88b74d530d686367)  
> Date: Sun, 11 Aug 2024 13:23:43 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   




---

[//]: # (END_SECTION d2f71046f6eb8b7dabc13cbb88b74d530d686367)
[//]: # (START_SECTION 1b8064c9760fd98037e0471373fdc6288f8c2910)
### Allow Python Selection for hashCreds()

> Commit: [1b8064c9760fd98037e0471373fdc6288f8c2910](https://github.com/dOpensource/dsiprouter/commit/1b8064c9760fd98037e0471373fdc6288f8c2910)  
> Date: Mon, 12 Aug 2024 07:10:46 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed:   


- this will allow us to remove the system python package after installation


---

[//]: # (END_SECTION 1b8064c9760fd98037e0471373fdc6288f8c2910)
[//]: # (START_SECTION 313906939ddd7d64a3ef9562c3e86c7101bdff8c)
### Explictily defined the Kamailio modules that will be installed.  This overcomes the bug in the lastest version of Kamailio, which has ims_icscf as a default extra module to install, but the corresponding ims_icscf-create.sql file is not part of the Debian package

> Commit: [313906939ddd7d64a3ef9562c3e86c7101bdff8c](https://github.com/dOpensource/dsiprouter/commit/313906939ddd7d64a3ef9562c3e86c7101bdff8c)  
> Date: Mon, 18 Nov 2024 03:34:53 +0000  
> Author: root (root@mack.test.dsiprouter.net)  
> Committer: root (root@mack.test.dsiprouter.net)  
> Signed:   




---

[//]: # (END_SECTION 313906939ddd7d64a3ef9562c3e86c7101bdff8c)
[//]: # (START_SECTION 1d7bc2d6a526458a943b79cc23b49169cdf4974e)
### Made Terrafrom Config more generic

> Commit: [1d7bc2d6a526458a943b79cc23b49169cdf4974e](https://github.com/dOpensource/dsiprouter/commit/1d7bc2d6a526458a943b79cc23b49169cdf4974e)  
> Date: Mon, 11 Nov 2024 01:43:22 +0000  
> Author: root (root@chelsea.test.dsiprouter.net)  
> Committer: root (root@chelsea.test.dsiprouter.net)  
> Signed:   




---

[//]: # (END_SECTION 1d7bc2d6a526458a943b79cc23b49169cdf4974e)
[//]: # (START_SECTION 9b5afa06020b84b598576c56edc09f3fa98be14c)
### Increased the default size of DigitalOcean Images from 1gb to 2gb

> Commit: [9b5afa06020b84b598576c56edc09f3fa98be14c](https://github.com/dOpensource/dsiprouter/commit/9b5afa06020b84b598576c56edc09f3fa98be14c)  
> Date: Sun, 10 Nov 2024 23:12:26 +0000  
> Author: root (root@chelsea.test.dsiprouter.net)  
> Committer: root (root@chelsea.test.dsiprouter.net)  
> Signed:   




---

[//]: # (END_SECTION 9b5afa06020b84b598576c56edc09f3fa98be14c)
[//]: # (START_SECTION 3da760ed578537f9f39475bb6404d3931af22dfc)
### Made UltraDict the first python package to be installed

> Commit: [3da760ed578537f9f39475bb6404d3931af22dfc](https://github.com/dOpensource/dsiprouter/commit/3da760ed578537f9f39475bb6404d3931af22dfc)  
> Date: Sun, 10 Nov 2024 22:47:22 +0000  
> Author: root (root@mack.test.dsiprouter.net)  
> Committer: root (root@mack.test.dsiprouter.net)  
> Signed:   




---

[//]: # (END_SECTION 3da760ed578537f9f39475bb6404d3931af22dfc)
[//]: # (START_SECTION 92eefb44fc4b1cb17ad9908a77b7587f5a408baa)
### Terraform PR Build

> Commit: [92eefb44fc4b1cb17ad9908a77b7587f5a408baa](https://github.com/dOpensource/dsiprouter/commit/92eefb44fc4b1cb17ad9908a77b7587f5a408baa)  
> Date: Thu, 3 Oct 2024 17:02:42 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- add support for building from a PR in terraform builds


---

[//]: # (END_SECTION 92eefb44fc4b1cb17ad9908a77b7587f5a408baa)
[//]: # (START_SECTION e19f0de2ab42f6630ca65aff48a7cea1b2f656c8)
### Fix UltraDict Build on Debian12

> Commit: [e19f0de2ab42f6630ca65aff48a7cea1b2f656c8](https://github.com/dOpensource/dsiprouter/commit/e19f0de2ab42f6630ca65aff48a7cea1b2f656c8)  
> Date: Wed, 11 Sep 2024 11:24:35 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  


- add libffi-dev dependency to fix UltraDict wheel build


---

[//]: # (END_SECTION e19f0de2ab42f6630ca65aff48a7cea1b2f656c8)
[//]: # (START_SECTION 9560aab94b63edc79181c8e973a226cffaf89aa3)
### Ensure Python venv Built From New System Deps on Debian11

> Commit: [9560aab94b63edc79181c8e973a226cffaf89aa3](https://github.com/dOpensource/dsiprouter/commit/9560aab94b63edc79181c8e973a226cffaf89aa3)  
> Date: Tue, 3 Sep 2024 15:53:38 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  




---

[//]: # (END_SECTION 9560aab94b63edc79181c8e973a226cffaf89aa3)
[//]: # (START_SECTION 59a745237cd9586f8dc2224a423365724a90ad21)
### Update dsiprouter.sh

> Commit: [59a745237cd9586f8dc2224a423365724a90ad21](https://github.com/dOpensource/dsiprouter/commit/59a745237cd9586f8dc2224a423365724a90ad21)  
> Date: Tue, 13 Aug 2024 06:07:37 -0400  
> Author: Mack Hendricks (mack@dopensource.com)  
> Committer: GitHub (noreply@github.com)  
> Signed:   


- Removed the creation of swap and removal of swap from the installer until we review the effects on different operating systems.


---

[//]: # (END_SECTION 59a745237cd9586f8dc2224a423365724a90ad21)
[//]: # (START_SECTION 8bc13858f70633ec2ec2ade2b878759a3d6715b0)
### Fix Stubborn Woocommerce "Delivered" Status Check

> Commit: [8bc13858f70633ec2ec2ade2b878759a3d6715b0](https://github.com/dOpensource/dsiprouter/commit/8bc13858f70633ec2ec2ade2b878759a3d6715b0)  
> Date: Thu, 8 Aug 2024 11:56:32 -0600  
> Author: Tyler Moore (tmoore@goflyball.com)  
> Committer: Tyler Moore (tmoore@goflyball.com)  
> Signed: Tyler Moore (devopsec) <tmoore@goflyball.com>  




---

[//]: # (END_SECTION 8bc13858f70633ec2ec2ade2b878759a3d6715b0)
[//]: # (START_SECTION 6c73f8c46eb1477fcbaee6014e2a861e80f04c81)
### Updated Terraform scripts to work with Jenkins Parameters

> Commit: [6c73f8c46eb1477fcbaee6014e2a861e80f04c81](https://github.com/dOpensource/dsiprouter/commit/6c73f8c46eb1477fcbaee6014e2a861e80f04c81)  
> Date: Thu, 8 Aug 2024 05:25:00 +0000  
> Author: Mack Hendricks (mack.hendricks@gmail.com)  
> Committer: Mack Hendricks (mack.hendricks@gmail.com)  
> Signed:   




---

[//]: # (END_SECTION 6c73f8c46eb1477fcbaee6014e2a861e80f04c81)
[//]: # (START_SECTION 073aae22bea1191cd548d7ee676d571df4487891)
### Added logic to handle adding and updating carriers from the UI

> Commit: [073aae22bea1191cd548d7ee676d571df4487891](https://github.com/dOpensource/dsiprouter/commit/073aae22bea1191cd548d7ee676d571df4487891)  
> Date: Thu, 8 Aug 2024 03:50:53 +0000  
> Author: Mack Hendricks (mack.hendricks@gmail.com)  
> Committer: Mack Hendricks (mack.hendricks@gmail.com)  
> Signed:   




---

[//]: # (END_SECTION 073aae22bea1191cd548d7ee676d571df4487891)
[//]: # (START_SECTION 0a9b0322870cd277aa41e0abb7f95ed026909d4f)
### Fixed Carriergroups Post API

> Commit: [0a9b0322870cd277aa41e0abb7f95ed026909d4f](https://github.com/dOpensource/dsiprouter/commit/0a9b0322870cd277aa41e0abb7f95ed026909d4f)  
> Date: Wed, 7 Aug 2024 23:50:21 +0000  
> Author: root (root@demo-dsip-v0.760)  
> Commit
Download .txt
gitextract_y6_vpjk0/

├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.md
│   │   └── config.yml
│   └── PULL_REQUEST_TEMPLATE/
│       └── default.md
├── .gitignore
├── .readthedocs.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── CONTRIBUTORS.md
├── HA/
│   ├── consul/
│   │   ├── consul.fc
│   │   ├── consul.hcl
│   │   ├── consul.service
│   │   ├── consul.te
│   │   ├── installConsulCluster.sh
│   │   └── server.hcl
│   ├── mysql/
│   │   ├── installAAGaleraReplication.sh
│   │   └── installAAGroupReplication.sh
│   ├── pacemaker/
│   │   ├── AWS/
│   │   │   └── ocf-floatip
│   │   ├── DO/
│   │   │   ├── assign-ip
│   │   │   └── ocf-floatip
│   │   ├── installKamCluster.sh
│   │   ├── nodeutil.sh
│   │   └── scripts/
│   │       ├── stage1.sh
│   │       ├── stage2.sh
│   │       └── stage3.sh
│   └── shared_lib.sh
├── Jenkinsfile
├── Jenkinsfile.common
├── LICENSE
├── README.md
├── cloud/
│   ├── build_image.sh
│   ├── build_instance.sh
│   ├── cloud-init/
│   │   ├── configs/
│   │   │   ├── AWS.cfg
│   │   │   ├── AZURE.cfg
│   │   │   ├── DO.cfg
│   │   │   ├── GCE.cfg
│   │   │   └── VULTR.cfg
│   │   └── templates/
│   │       ├── hosts.almalinux.tmpl
│   │       ├── hosts.amzn.tmpl
│   │       ├── hosts.centos.tmpl
│   │       ├── hosts.debian.tmpl
│   │       ├── hosts.rhel.tmpl
│   │       ├── hosts.rocky.tmpl
│   │       └── hosts.ubuntu.tmpl
│   ├── find_hosts_tmpl.sh
│   └── pre-snapshot.sh
├── dnsmasq/
│   ├── almalinux/
│   │   └── install.sh
│   ├── amzn/
│   │   └── install.sh
│   ├── centos/
│   │   └── install.sh
│   ├── configs/
│   │   ├── dnsmasq_sh.conf
│   │   ├── ifupdown/
│   │   │   ├── default.conf
│   │   │   ├── networking-pre.sh
│   │   │   └── override.conf
│   │   ├── networkmanager/
│   │   │   ├── dsiprouter.conf
│   │   │   └── wait-override.conf
│   │   ├── resolv.conf
│   │   ├── resolvconf_def
│   │   ├── resolvconf_upd
│   │   ├── systemdnetworkd/
│   │   │   ├── docker.network
│   │   │   ├── dsiprouter.network
│   │   │   ├── networkd-pre.sh
│   │   │   ├── override.conf
│   │   │   └── wait-override.conf
│   │   └── systemdresolved/
│   │       └── dsiprouter.conf
│   ├── debian/
│   │   ├── 12.sh
│   │   └── install.sh
│   ├── init.d/
│   │   └── dnsmasq
│   ├── rhel/
│   │   └── install.sh
│   ├── rocky/
│   │   └── install.sh
│   ├── systemd/
│   │   ├── dnsmasq-v1.service
│   │   ├── dnsmasq-v2.service
│   │   └── dnsmasq-v3.service
│   └── ubuntu/
│       └── install.sh
├── docker/
│   ├── dsiprouter/
│   │   ├── dockerfile
│   │   └── wait-for-dsiprouter-mysql.sh
│   └── mysql/
│       └── dockerfile
├── docker-compose.yml
├── docs/
│   ├── Makefile
│   ├── requirements.in
│   ├── requirements.txt
│   └── source/
│       ├── _static/
│       │   └── placeholder
│       ├── _templates/
│       │   └── placeholder
│       ├── conf.py
│       ├── dev/
│       │   ├── database.rst
│       │   ├── dsiprouter.rst
│       │   ├── index.rst
│       │   ├── modules.rst
│       │   ├── settings.rst
│       │   ├── shared.rst
│       │   ├── sysloginit.rst
│       │   └── util.rst
│       ├── index.rst
│       ├── routes/
│       │   ├── details.rst
│       │   ├── index.rst
│       │   └── summary.rst
│       └── user/
│           ├── api.rst
│           ├── carrier_groups.rst
│           ├── command_line_options.rst
│           ├── conf.py
│           ├── configuring.rst
│           ├── debian_install.rst
│           ├── domains.rst
│           ├── global_outbound_routes.rst
│           ├── images/
│           │   └── DID_test.csv
│           ├── inbound_did_mapping.rst
│           ├── index.rst
│           ├── installing.rst
│           ├── pbxs_and_endpoints.rst
│           ├── resources.rst
│           ├── rhel_install.rst
│           ├── supported_configurations.rst
│           ├── troubleshooting.rst
│           ├── upgrade_0.50_to_0.51.rst
│           ├── upgrade_0.522_to_0.523.rst
│           ├── upgrade_0.621_to_0.63.rst
│           ├── upgrading.rst
│           └── use-cases.rst
├── dsiprouter/
│   ├── almalinux/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── amzn/
│   │   └── 2.sh
│   ├── centos/
│   │   ├── 7.sh
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── debian/
│   │   ├── 10.sh
│   │   ├── 11.sh
│   │   ├── 12.sh
│   │   └── 9.sh
│   ├── dsip-net-cfg.py
│   ├── dsip_completion.sh
│   ├── dsip_lib.sh
│   ├── pbkdf2.sh
│   ├── rhel/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── rocky/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── sudoers.d/
│   │   └── 99-dsiprouter
│   ├── systemd/
│   │   ├── dsiprouter-v1.service
│   │   └── dsiprouter-v2.service
│   └── ubuntu/
│       ├── 20.sh
│       ├── 22.sh
│       └── 24.sh
├── dsiprouter.sh
├── gui/
│   ├── database/
│   │   └── __init__.py
│   ├── dsiprouter.py
│   ├── dsiprouter_cron.py
│   ├── dsiprouter_ut.py
│   ├── modules/
│   │   ├── api/
│   │   │   ├── api.sql
│   │   │   ├── api_functions.py
│   │   │   ├── api_routes.py
│   │   │   ├── auth/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── functions.py
│   │   │   │   ├── ldap/
│   │   │   │   │   ├── __init__.py
│   │   │   │   │   └── interface.py
│   │   │   │   └── routes.py
│   │   │   ├── carriergroups/
│   │   │   │   ├── functions.py
│   │   │   │   ├── plugin/
│   │   │   │   │   └── twilio/
│   │   │   │   │       ├── carrier_plugintype_version.py
│   │   │   │   │       └── interface.py
│   │   │   │   └── routes.py
│   │   │   ├── cron_functions.py
│   │   │   ├── install.sh
│   │   │   ├── kamailio/
│   │   │   │   ├── errors.py
│   │   │   │   └── functions.py
│   │   │   ├── licensemanager/
│   │   │   │   ├── classes.py
│   │   │   │   ├── cli.py
│   │   │   │   ├── functions.py
│   │   │   │   └── routes.py
│   │   │   ├── mediaserver/
│   │   │   │   ├── plugin/
│   │   │   │   │   ├── fusion/
│   │   │   │   │   │   └── interface.py
│   │   │   │   │   └── fusionpbx
│   │   │   │   └── routes.py
│   │   │   └── sample_api.py
│   │   ├── cdr/
│   │   │   ├── cdrs.sql
│   │   │   ├── cron_functions.py
│   │   │   └── install.sh
│   │   ├── certificates/
│   │   │   ├── certificates.sql
│   │   │   └── install.sh
│   │   ├── custom_routing/
│   │   │   ├── custom_routing.sql
│   │   │   └── install.sh
│   │   ├── dnid_enrichment/
│   │   │   ├── dnid_enrichment.sql
│   │   │   └── install.sh
│   │   ├── domain/
│   │   │   ├── __init__.py
│   │   │   ├── domain_mapping.sql
│   │   │   ├── domain_routes.py
│   │   │   └── install.sh
│   │   ├── flowroute/
│   │   │   └── __init__.py
│   │   ├── frauddetection/
│   │   │   ├── fraud.py
│   │   │   └── install.sh
│   │   ├── fusionpbx/
│   │   │   ├── dsiprouter-provisioner.conf
│   │   │   ├── dsiprouter-provisioner.tpl
│   │   │   ├── dsiprouter.nginx
│   │   │   ├── dsiprouter.nginx.tpl
│   │   │   ├── fusionpbx_sync_functions.py
│   │   │   ├── html/
│   │   │   │   └── images/
│   │   │   │       └── placeholder.txt
│   │   │   └── install.sh
│   │   └── upgrade/
│   │       └── __init__.py
│   ├── requirements.txt
│   ├── settings.py
│   ├── shared.py
│   ├── static/
│   │   ├── css/
│   │   │   ├── bootstrap-theme.css
│   │   │   ├── bootstrap-toggle.css
│   │   │   ├── bootstrap.css
│   │   │   ├── carriergroups.css
│   │   │   ├── cdrs.css
│   │   │   ├── certificates.css
│   │   │   ├── combobox.css
│   │   │   ├── dashboard.css
│   │   │   ├── highlight/
│   │   │   │   ├── LICENSE
│   │   │   │   ├── codepen-embed.css
│   │   │   │   ├── darcula.css
│   │   │   │   ├── default.css
│   │   │   │   ├── github-gist.css
│   │   │   │   ├── github.css
│   │   │   │   ├── googlecode.css
│   │   │   │   ├── idea.css
│   │   │   │   └── monokai-sublime.css
│   │   │   ├── main.css
│   │   │   ├── msteams.css
│   │   │   └── titatoggle-dist.css
│   │   ├── fonts/
│   │   │   └── icomoon.json
│   │   ├── js/
│   │   │   ├── backupandrestore.js
│   │   │   ├── bootstrap-toggle.js
│   │   │   ├── bootstrap.js
│   │   │   ├── carriergroups.js
│   │   │   ├── cdrs.js
│   │   │   ├── certificates.js
│   │   │   ├── combobox.js
│   │   │   ├── dashboard.js
│   │   │   ├── datatables.js
│   │   │   ├── domains.js
│   │   │   ├── endpointgroups.js
│   │   │   ├── highlight/
│   │   │   │   ├── LICENSE
│   │   │   │   └── highlight.pack.js
│   │   │   ├── inboundmapping.js
│   │   │   ├── jquery.js
│   │   │   ├── jquery.tabledit.js
│   │   │   ├── license_manager.js
│   │   │   ├── main.js
│   │   │   ├── msteams.js
│   │   │   ├── npm.js
│   │   │   ├── outboundroutes.js
│   │   │   ├── stirshaken.js
│   │   │   ├── teleblock.js
│   │   │   ├── transnexus.js
│   │   │   ├── upgrade.js
│   │   │   ├── util.js
│   │   │   └── validator.js
│   │   └── template/
│   │       └── DID_example.csv
│   ├── sysloginit.py
│   ├── templates/
│   │   ├── backupandrestore.html
│   │   ├── carriergroups.html
│   │   ├── carriers.html
│   │   ├── cdrs.html
│   │   ├── certificates.html
│   │   ├── dashboard.html
│   │   ├── domains.html
│   │   ├── endpointgroups.html
│   │   ├── error.html
│   │   ├── fullwidth_layout.html
│   │   ├── inboundmapping.html
│   │   ├── includes/
│   │   │   └── overrides.js
│   │   ├── index.html
│   │   ├── license_manager.html
│   │   ├── license_required.html
│   │   ├── login_layout.html
│   │   ├── msteams.html
│   │   ├── outboundroutes.html
│   │   ├── stirshaken.html
│   │   ├── table_layout.html
│   │   ├── teleblock.html
│   │   ├── transnexus.html
│   │   ├── upgrade.html
│   │   └── util.jinja2.html
│   └── util/
│       ├── conversions.py
│       ├── cron.py
│       ├── file_handling.py
│       ├── ipc.py
│       ├── kamtls.py
│       ├── letsencrypt.py
│       ├── networking.py
│       ├── notifications.py
│       ├── parse_json.py
│       ├── persistence.py
│       ├── pyasync.py
│       ├── security.py
│       └── time_funcs.py
├── kamailio/
│   ├── almalinux/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── amzn/
│   │   └── 2.sh
│   ├── centos/
│   │   ├── 7.sh
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── configs/
│   │   ├── kamailio.cfg
│   │   ├── stir-shaken.cfg
│   │   ├── tls.cfg
│   │   └── transnexus.cfg
│   ├── debian/
│   │   ├── 10.sh
│   │   ├── 11.sh
│   │   ├── 12.sh
│   │   └── 9.sh
│   ├── defaults/
│   │   ├── address.csv
│   │   ├── address.sql
│   │   ├── dispatcher.csv
│   │   ├── dispatcher.sql
│   │   ├── dr_gateways.csv
│   │   ├── dr_gateways.sql
│   │   ├── dr_gw_lists.csv
│   │   ├── dr_gw_lists.sql
│   │   ├── dr_rules.csv
│   │   ├── dr_rules.sql
│   │   ├── dsip_call_settings.sql
│   │   ├── dsip_cdrinfo.sql
│   │   ├── dsip_forwarding.sql
│   │   ├── dsip_gw2gwgroup.sql
│   │   ├── dsip_gwgroup2lb.sql
│   │   ├── dsip_lcr.sql
│   │   ├── dsip_maintmode.sql
│   │   ├── dsip_notification.sql
│   │   ├── dsip_settings.sql
│   │   ├── subscribers.sql
│   │   └── uacreg.sql
│   ├── htable-kam57.patch
│   ├── kamdbctl.patch
│   ├── modules/
│   │   └── dsiprouter/
│   │       ├── Makefile
│   │       ├── README.md
│   │       ├── mod_dsiprouter.c
│   │       ├── mod_funcs.c
│   │       └── mod_funcs.h
│   ├── rhel/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── rocky/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── stir_shaken.patch
│   ├── systemd/
│   │   ├── kamailio-v1.service
│   │   ├── kamailio-v2.service
│   │   └── kamailio.conf
│   ├── uac.patch
│   └── ubuntu/
│       ├── 20.sh
│       ├── 22.sh
│       └── 24.sh
├── mysql/
│   ├── almalinux/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── amzn/
│   │   └── 2.sh
│   ├── centos/
│   │   ├── 7.sh
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── debian/
│   │   ├── 10.sh
│   │   ├── 11.sh
│   │   ├── 12.sh
│   │   └── 9.sh
│   ├── rhel/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── rocky/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── systemd/
│   │   ├── dummy.service
│   │   ├── override.conf
│   │   └── override.sh
│   └── ubuntu/
│       ├── 20.sh
│       ├── 22.sh
│       └── 24.sh
├── nginx/
│   ├── almalinux/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── amzn/
│   │   └── 2.sh
│   ├── centos/
│   │   ├── 7.sh
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── configs/
│   │   ├── dsiprouter.conf
│   │   └── nginx.conf
│   ├── debian/
│   │   ├── 10.sh
│   │   ├── 11.sh
│   │   ├── 12.sh
│   │   └── 9.sh
│   ├── rhel/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── rocky/
│   │   ├── 8.sh
│   │   └── 9.sh
│   ├── selinux/
│   │   └── centos.te
│   ├── systemd/
│   │   ├── nginx-stop.sh
│   │   ├── nginx-v1.service
│   │   ├── nginx-v2.service
│   │   ├── nginx-watcher-v1.service
│   │   ├── nginx-watcher-v2.service
│   │   └── nginx-watcher.path
│   └── ubuntu/
│       ├── 20.sh
│       ├── 22.sh
│       └── 24.sh
├── resources/
│   ├── apt/
│   │   ├── debian/
│   │   │   ├── 10/
│   │   │   │   ├── official-releases.list
│   │   │   │   └── official-releases.pref
│   │   │   ├── 11/
│   │   │   │   ├── official-releases.list
│   │   │   │   └── official-releases.pref
│   │   │   ├── 12/
│   │   │   │   ├── official-releases.list
│   │   │   │   └── official-releases.pref
│   │   │   └── 9/
│   │   │       ├── official-releases.list
│   │   │       └── official-releases.pref
│   │   └── ubuntu/
│   │       ├── 20.04/
│   │       │   ├── official-releases.list
│   │       │   └── official-releases.pref
│   │       ├── 22.04/
│   │       │   ├── official-releases.list
│   │       │   └── official-releases.pref
│   │       └── 24.04/
│   │           ├── official-releases.list
│   │           └── official-releases.pref
│   ├── git/
│   │   ├── check_syntax.py
│   │   ├── commit-msg
│   │   ├── gitattributes
│   │   ├── gitconfig
│   │   ├── gitignore
│   │   ├── gitwrapper.sh
│   │   ├── hooks/
│   │   │   ├── commit-msg
│   │   │   ├── post-commit
│   │   │   ├── pre-commit
│   │   │   ├── pre-push
│   │   │   └── prepare-commit-msg
│   │   └── merge-changelog.sh
│   ├── logrotate/
│   │   ├── consul
│   │   ├── dsiprouter
│   │   ├── kamailio
│   │   └── rtpengine
│   ├── man/
│   │   └── dsiprouter.1
│   ├── mysql/
│   │   ├── asterisk-realtime-config.sql
│   │   └── asterisk-realtime-setup.sql
│   ├── stir_shaken/
│   │   └── generate_self_signed_cert.sh
│   ├── syslog/
│   │   ├── consul.conf
│   │   ├── dsiprouter.conf
│   │   ├── kamailio.conf
│   │   ├── rsyslog.conf
│   │   └── rtpengine.conf
│   ├── terraform/
│   │   └── do/
│   │       ├── .gitignore
│   │       ├── README.md
│   │       ├── main.tf
│   │       ├── terraform.tfvars.sample
│   │       └── variables.tf
│   ├── upgrade/
│   │   ├── v0.72/
│   │   │   ├── scripts/
│   │   │   │   ├── bootstrap.sh
│   │   │   │   └── migrate.sh
│   │   │   └── settings.json
│   │   ├── v0.721/
│   │   │   ├── scripts/
│   │   │   │   ├── bootstrap.sh
│   │   │   │   └── migrate.sh
│   │   │   └── settings.json
│   │   ├── v0.73/
│   │   │   ├── scripts/
│   │   │   │   ├── bootstrap.sh
│   │   │   │   └── migrate.sh
│   │   │   └── settings.json
│   │   ├── v0.74/
│   │   │   ├── scripts/
│   │   │   │   └── migrate.sh
│   │   │   └── settings.json
│   │   ├── v0.75/
│   │   │   ├── clear_defaults.sql
│   │   │   ├── migrate_data.sql
│   │   │   ├── pre_import_data.sql
│   │   │   ├── scripts/
│   │   │   │   ├── bootstrap.sh
│   │   │   │   └── migrate.sh
│   │   │   └── settings.json
│   │   ├── v0.76/
│   │   │   ├── scripts/
│   │   │   │   └── migrate.sh
│   │   │   └── settings.json
│   │   ├── v0.77/
│   │   │   ├── clear_defaults.sql
│   │   │   ├── scripts/
│   │   │   │   └── migrate.sh
│   │   │   └── settings.json
│   │   └── v0.78/
│   │       ├── dsip-fwd-new.sql
│   │       ├── dsip-fwd-old.sql
│   │       ├── scripts/
│   │       │   └── migrate.sh
│   │       └── settings.json
│   └── uploadOutRoute.py
├── rtpengine/
│   ├── almalinux/
│   │   └── install.sh
│   ├── amzn/
│   │   ├── install.sh
│   │   └── rtpengine.spec
│   ├── centos/
│   │   └── install.sh
│   ├── configs/
│   │   ├── default.conf
│   │   └── rtpengine.conf
│   ├── deb-mr11.5.1.11.patch
│   ├── debian/
│   │   └── install.sh
│   ├── el-mr11.5.1.11.patch
│   ├── rhel/
│   │   └── install.sh
│   ├── rocky/
│   │   └── install.sh
│   ├── rtpengine-start-pre
│   ├── rtpengine-stop-post
│   ├── systemd/
│   │   ├── dummy.service
│   │   ├── rtpengine-v1.service
│   │   ├── rtpengine-v2.service
│   │   └── rtpengine-v3.service
│   └── ubuntu/
│       └── install.sh
└── testing/
    ├── 0.sh
    ├── 1.sh
    ├── 10.sh
    ├── 11.sh
    ├── 12.sh.dev
    ├── 13.sh.dev
    ├── 14.sh.dev
    ├── 15.sh.dev
    ├── 16.sh
    ├── 17.sh
    ├── 18.sh
    ├── 19.sh
    ├── 2.sh
    ├── 20.sh
    ├── 21.sh
    ├── 3.sh
    ├── 4.sh
    ├── 5.sh
    ├── 6.sh
    ├── 7.sh
    ├── 8.sh
    ├── 9.sh.dev
    ├── INVITE.sip
    ├── Makefile
    ├── README.md
    ├── api/
    │   └── dsiprouter.postman_collection.json
    ├── include/
    │   └── common
    ├── payload.json
    └── sql/
        ├── v0.522/
        │   └── kamailio.sql
        ├── v0.523+ent/
        │   ├── grants.sql
        │   └── kamailio.sql
        └── v0.60+ent/
            ├── grants.sql
            └── kamailio.sql
Download .txt
SYMBOL INDEX (1051 symbols across 90 files)

FILE: dsiprouter/dsip-net-cfg.py
  function hasFloatingIp (line 35) | def hasFloatingIp():
  function getAnchorGateway (line 43) | def getAnchorGateway():
  function getAnchorIpAddr (line 48) | def getAnchorIpAddr():
  function ipAddrToIface (line 53) | def ipAddrToIface(ip_addr):
  function getDefRoutes (line 66) | def getDefRoutes():
  function isIpDefRoute (line 80) | def isIpDefRoute(check_ip):

FILE: gui/database/__init__.py
  class Gateways (line 45) | class Gateways(object):
    method __init__ (line 55) | def __init__(self, name, address, strip, prefix, type=0, gwgroup=None,...
    method buildAttrs (line 71) | def buildAttrs(gwid=0, type=0, msteams_domain='', signalling='proxy', ...
    method attrsToDict (line 75) | def attrsToDict(self):
  class GatewayGroups (line 101) | class GatewayGroups(object):
    class FILTER (line 109) | class FILTER(Enum):
    method __init__ (line 115) | def __init__(self, name, gwlist=[], type=settings.FLT_CARRIER, dlg_tim...
  class Address (line 124) | class Address(object):
    method __init__ (line 132) | def __init__(self, name, ip_addr, mask, type, gwgroup=None, port=0):
  class InboundMapping (line 146) | class InboundMapping(object):
    method __init__ (line 154) | def __init__(self, groupid, prefix, gwlist, description=''):
  class OutboundRoutes (line 165) | class OutboundRoutes(object):
    method __init__ (line 171) | def __init__(self, groupid, prefix, timerec, priority, routeid, gwlist...
  class CustomRouting (line 183) | class CustomRouting(object):
    method __init__ (line 188) | def __init__(self, locality, ppm, description):
  class dSIPLCR (line 196) | class dSIPLCR(object):
    method __init__ (line 205) | def __init__(self, pattern, from_prefix, dr_groupid, cost=0.00):
  class dSIPMultiDomainMapping (line 214) | class dSIPMultiDomainMapping(object):
    class FLAGS (line 220) | class FLAGS(Enum):
    method __init__ (line 228) | def __init__(self, pbx_id, db_host, db_username, db_password, domain_l...
  class dSIPDomainMapping (line 241) | class dSIPDomainMapping(object):
    class FLAGS (line 247) | class FLAGS(Enum):
    method __init__ (line 260) | def __init__(self, pbx_id, domain_id, attr_list, type=0, enabled=1):
  class Subscribers (line 270) | class Subscribers(object):
    method __init__ (line 276) | def __init__(self, username, password, domain, gwid, email_address=None):
  class dSIPLeases (line 288) | class dSIPLeases(object):
    method __init__ (line 294) | def __init__(self, gwid, sid, ttl):
  class dSIPMaintModes (line 303) | class dSIPMaintModes(object):
    method __init__ (line 309) | def __init__(self, ipaddr, gwid, status=1):
  class dSIPCallSettings (line 318) | class dSIPCallSettings(object):
    method __init__ (line 323) | def __init__(self, gwgroupid, limit=None, timeout=None):
  class dSIPNotification (line 331) | class dSIPNotification(object):
    class FLAGS (line 337) | class FLAGS(Enum):
    method __init__ (line 343) | def __init__(self, gwgroupid, type, method, value):
  class dSIPHardFwd (line 353) | class dSIPHardFwd(object):
    method __init__ (line 358) | def __init__(self, dr_ruleid, did, dr_groupid):
  class dSIPCDRInfo (line 366) | class dSIPCDRInfo(object):
    method __init__ (line 371) | def __init__(self, gwgroupid, email, send_interval):
  class dSIPFailFwd (line 380) | class dSIPFailFwd(object):
    method __init__ (line 385) | def __init__(self, dr_ruleid, did, dr_groupid):
  class dSIPCertificates (line 393) | class dSIPCertificates(object):
    method __init__ (line 398) | def __init__(self, domain, type, email, cert, key):
  class dSIPDNIDEnrichment (line 408) | class dSIPDNIDEnrichment(object):
    method __init__ (line 413) | def __init__(self, dnid, country_code='', routing_number='', rule_name...
  class UAC (line 424) | class UAC(object):
    class FLAGS (line 430) | class FLAGS(Enum):
    method __init__ (line 438) | def __init__(self, uuid, username="", password="", realm="", auth_user...
  function uacMapperEventHandler (line 454) | def uacMapperEventHandler(mapper, connection, target):
  class Domain (line 461) | class Domain(object):
    method __init__ (line 467) | def __init__(self, domain, did=None, last_modified=datetime.utcnow()):
    method __validateDomain (line 475) | def __validateDomain(self, key, domain):
  class DomainAttrs (line 481) | class DomainAttrs(object):
    class FLAGS (line 487) | class FLAGS(Enum):
    method __init__ (line 491) | def __init__(self, did, name="pbx_ip", type=2, value=None, last_modifi...
  class Dispatcher (line 502) | class Dispatcher(object):
    method __init__ (line 525) | def __init__(self, setid, destination, flags=None, priority=None, attr...
    method buildAttrs (line 538) | def buildAttrs(rweight=0, signalling='proxy', media='proxy'):
    method buildDescription (line 543) | def buildDescription(name=None, gwid=None):
    method attrsToDict (line 551) | def attrsToDict(self):
  class dSIPUser (line 566) | class dSIPUser(object):
    method __init__ (line 571) | def __init__(self, firstname, lastname, username, password, roles, dom...
  class DsipGwgroup2LB (line 585) | class DsipGwgroup2LB(object):
  class DsipSettings (line 588) | class DsipSettings(OrderedDict):
  function createDBURI (line 596) | def createDBURI(db_driver=None, db_type=None, db_user=None, db_pass=None...
  function createValidEngine (line 644) | def createValidEngine(uri_list):
  function startSession (line 690) | def startSession():
  function createSessionObjects (line 705) | def createSessionObjects():
  class DummySession (line 798) | class DummySession():
    method __contains__ (line 806) | def __contains__(self, *args, **kwargs):
    method __iter__ (line 809) | def __iter__(self, *args, **kwargs):
    method add (line 812) | def add(self, *args, **kwargs):
    method add_all (line 815) | def add_all(self, *args, **kwargs):
    method begin (line 818) | def begin(self, *args, **kwargs):
    method begin_nested (line 821) | def begin_nested(self, *args, **kwargs):
    method close (line 824) | def close(self, *args, **kwargs):
    method commit (line 827) | def commit(self, *args, **kwargs):
    method connection (line 830) | def connection(self, *args, **kwargs):
    method delete (line 833) | def delete(self, *args, **kwargs):
    method execute (line 836) | def execute(self, *args, **kwargs):
    method expire (line 839) | def expire(self, *args, **kwargs):
    method expire_all (line 842) | def expire_all(self, *args, **kwargs):
    method expunge (line 845) | def expunge(self, *args, **kwargs):
    method expunge_all (line 848) | def expunge_all(self, *args, **kwargs):
    method flush (line 851) | def flush(self, *args, **kwargs):
    method get_bind (line 854) | def get_bind(self, *args, **kwargs):
    method is_modified (line 857) | def is_modified(self, *args, **kwargs):
    method bulk_save_objects (line 860) | def bulk_save_objects(self, *args, **kwargs):
    method bulk_insert_mappings (line 863) | def bulk_insert_mappings(self, *args, **kwargs):
    method bulk_update_mappings (line 866) | def bulk_update_mappings(self, *args, **kwargs):
    method merge (line 869) | def merge(self, *args, **kwargs):
    method query (line 872) | def query(self, *args, **kwargs):
    method refresh (line 875) | def refresh(self, *args, **kwargs):
    method rollback (line 878) | def rollback(self, *args, **kwargs):
    method scalar (line 881) | def scalar(self, *args, **kwargs):
    method remove (line 884) | def remove(self, *args, **kwargs):
    method configure (line 887) | def configure(self, *args, **kwargs):
    method query_property (line 890) | def query_property(self, *args, **kwargs):
  function settingsToTableFormat (line 894) | def settingsToTableFormat(settings, updates=None):
  function settingsTableToDict (line 988) | def settingsTableToDict(table_values, updates=None):
  function updateDsipSettingsTable (line 998) | def updateDsipSettingsTable(fields):
  function getDsipSettingsTableAsDict (line 1031) | def getDsipSettingsTableAsDict(dsip_id, updates=None):

FILE: gui/dsiprouter.py
  function before_first_request (line 94) | def before_first_request():
  function before_request (line 101) | def before_request():
  function api_before_request (line 114) | def api_before_request():
  function index (line 122) | def index():
  function displayError (line 143) | def displayError():
  function backupandrestore (line 151) | def backupandrestore():
  function certificates (line 172) | def certificates():
  function favicon (line 194) | def favicon():
  function login (line 200) | def login():
  function logout (line 254) | def logout():
  function addUpdateCarrierGroups (line 277) | def addUpdateCarrierGroups():
  function deleteCarrierGroups (line 290) | def deleteCarrierGroups():
  function deleteCarriers (line 363) | def deleteCarriers():
  function displayEndpointGroups (line 457) | def displayEndpointGroups():
  function displayNumberEnrichment (line 483) | def displayNumberEnrichment():
  function displayCDRS (line 507) | def displayCDRS():
  function displayLicenseManager (line 541) | def displayLicenseManager():
  function addUpdateEndpointGroups (line 566) | def addUpdateEndpointGroups():
  function deletePBX (line 636) | def deletePBX():
  function displayInboundMapping (line 710) | def displayInboundMapping():
  function addUpdateInboundMapping (line 788) | def addUpdateInboundMapping():
  function deleteInboundMapping (line 1213) | def deleteInboundMapping():
  function processInboundMappingImport (line 1293) | def processInboundMappingImport(filename, override_gwgroupid, db):
  function importInboundMapping (line 1373) | def importInboundMapping():
  function displayTeleBlock (line 1429) | def displayTeleBlock():
  function addUpdateTeleBlock (line 1460) | def addUpdateTeleBlock():
  function displayTransNexus (line 1497) | def displayTransNexus(msg=None):
  function addUpdateTransNexus (line 1536) | def addUpdateTransNexus():
  function displayOutboundRoutes (line 1593) | def displayOutboundRoutes():
  function addUpateOutboundRoutes (line 1661) | def addUpateOutboundRoutes():
  function deleteOutboundRoute (line 1829) | def deleteOutboundRoute():
  function displayStirShaken (line 1886) | def displayStirShaken(msg=None):
  function addUpdateStirShaken (line 1934) | def addUpdateStirShaken():
  function displayUpgrade (line 2000) | def displayUpgrade(msg=None):
  function runUpgrade (line 2045) | def runUpgrade(cmd, env):
  function startUpgrade (line 2068) | def startUpgrade():
  function formatSSE (line 2101) | def formatSSE(data: str, event: str = None) -> str:
  function readLogChunk (line 2111) | def readLogChunk(log_file):
  function checkUpgradeStatus (line 2137) | def checkUpgradeStatus():
  function getUpgradeStatus (line 2146) | def getUpgradeStatus():
  function getUpgradeLog (line 2169) | def getUpgradeLog():
  function yesOrNoFilter (line 2206) | def yesOrNoFilter(list, field):
  function noneFilter (line 2213) | def noneFilter(list):
  function attrFilter (line 2220) | def attrFilter(s, attr, delims=(',', ':')):
  function domainTypeFilter (line 2231) | def domainTypeFilter(list):
  function imgFilter (line 2246) | def imgFilter(name):
  function injectGlobals (line 2257) | def injectGlobals():
  function syncSettings (line 2312) | def syncSettings(new_fields={}, update_net=False):
  function sigHandler (line 2368) | def sigHandler(signum=None, frame=None):
  function replaceAppLoggers (line 2399) | def replaceAppLoggers(log_handler):
  function intializeGlobalSettings (line 2423) | def intializeGlobalSettings():
  function intializeGlobalState (line 2440) | def intializeGlobalState():
  function intializeAuthModules (line 2472) | def intializeAuthModules():
  function guiLicenseCheck (line 2486) | def guiLicenseCheck(tag):
  function initApp (line 2491) | def initApp(flask_app):
  function teardown (line 2580) | def teardown():
  function main (line 2614) | def main():

FILE: gui/dsiprouter_ut.py
  class TestUnit (line 4) | class TestUnit(unittest.TestCase):
    method setUp (line 6) | def setUp(self):
    method test_add_static_domain (line 9) | def test_add_static_domain(self):
    method test_getDomains (line 12) | def test_getDomains(self):

FILE: gui/modules/api/api.sql
  type `dsip_endpoint_lease` (line 2) | CREATE TABLE `dsip_endpoint_lease` (
  type `dsip_user` (line 13) | CREATE TABLE `dsip_user` (

FILE: gui/modules/api/api_functions.py
  function createApiResponse (line 19) | def createApiResponse(error=None, msg=None, kamreload=None, dsipreload=N...
  function showApiError (line 60) | def showApiError(ex, payload=None):
  function api_security (line 90) | def api_security(func):

FILE: gui/modules/api/api_routes.py
  function getKamailioStats (line 41) | def getKamailioStats():
  function handleReloadKamailio (line 64) | def handleReloadKamailio():
  function handleReloadDsiprouter (line 83) | def handleReloadDsiprouter():
  function getEndpointLease (line 136) | def getEndpointLease():
  function revokeEndpointLease (line 219) | def revokeEndpointLease(leaseid):
  function updateEndpoint (line 261) | def updateEndpoint(id):
  function handleInboundMapping (line 312) | def handleInboundMapping():
  function handleNotificationRequest (line 571) | def handleNotificationRequest():
  function deleteEndpointGroup (line 658) | def deleteEndpointGroup(gwgroupid):
  function getEndpointGroup (line 752) | def getEndpointGroup(gwgroupid):
  function listEndpointGroups (line 877) | def listEndpointGroups():
  function updateEndpointGroups (line 919) | def updateEndpointGroups(gwgroupid=None):
  function addEndpointGroups (line 1564) | def addEndpointGroups(data=None, endpointGroupType=None, domain=None):
  function getNumberEnrichment (line 1906) | def getNumberEnrichment(rule_id=None):
  function addNumberEnrichment (line 1983) | def addNumberEnrichment(request_payload=None):
  function updateNumberEnrichment (line 2096) | def updateNumberEnrichment(rule_id=None, request_payload=None):
  function deleteNumberEnrichment (line 2229) | def deleteNumberEnrichment(rule_id, request_payload=None):
  function fetchNumberEnrichment (line 2327) | def fetchNumberEnrichment(request_payload=None):
  function generateCDRS (line 2532) | def generateCDRS(
  function getGatewayGroupCDRS (line 2780) | def getGatewayGroupCDRS(gwgroupid=None):
  function getGatewayCDRS (line 2839) | def getGatewayCDRS(gwid=None):
  function createBackup (line 2896) | def createBackup():
  function restoreBackup (line 2929) | def restoreBackup():
  function generatePassword (line 2979) | def generatePassword():
  function getOptionMessageStatus (line 3000) | def getOptionMessageStatus(domain):
  function testConnectivity (line 3059) | def testConnectivity(domain):
  function getCertificates (line 3109) | def getCertificates(domain=None):
  function createCertificate (line 3155) | def createCertificate():
  function deleteCertificates (line 3267) | def deleteCertificates(domain=None):
  function uploadCertificates (line 3308) | def uploadCertificates(domain=None):

FILE: gui/modules/api/auth/functions.py
  function addDSIPUser (line 11) | def addDSIPUser(data=None):

FILE: gui/modules/api/auth/ldap/interface.py
  function initialize (line 16) | def initialize():
  function teardown (line 36) | def teardown():
  function authenticate (line 46) | def authenticate(username, password):

FILE: gui/modules/api/auth/routes.py
  function login (line 26) | def login():
  function createUser (line 92) | def createUser():
  function listUsers (line 138) | def listUsers():
  function getUser (line 176) | def getUser(id=None):
  function updateUser (line 223) | def updateUser(id=None):
  function deleteUser (line 284) | def deleteUser(id=None):

FILE: gui/modules/api/carriergroups/functions.py
  function displayCarrierGroups (line 16) | def displayCarrierGroups(gwgroup=None):
  function addUpdateCarrierGroups (line 83) | def addUpdateCarrierGroups(data=None):
  function displayCarriers (line 239) | def displayCarriers(gwid=None, gwgroup=None, newgwid=None):
  function addUpdateCarriers (line 348) | def addUpdateCarriers(data=None):

FILE: gui/modules/api/carriergroups/plugin/twilio/interface.py
  function getPluginMetaData (line 11) | def getPluginMetaData():
  function init (line 17) | def init(account_sid,auth_token):
  function createTrunk (line 39) | def createTrunk(client,trunk_name,dsip_ip_address,twilio_domain_name=def...
  function createIPAccessControlList (line 55) | def createIPAccessControlList(client,trunk_name,dsip_ip_address):
  function main (line 72) | def main():

FILE: gui/modules/api/carriergroups/routes.py
  function listCarrierGroups (line 25) | def listCarrierGroups():
  function getPluginMetaData (line 97) | def getPluginMetaData(plugin_name):
  function addCarrierGroups (line 151) | def addCarrierGroups(id=None):

FILE: gui/modules/api/cron_functions.py
  function cleanupLeases (line 5) | def cleanupLeases():

FILE: gui/modules/api/kamailio/errors.py
  class KamailioError (line 1) | class KamailioError(Exception):
    method __init__ (line 6) | def __init__(self, *args, **kwargs):
  class NoDispatcherSets (line 10) | class NoDispatcherSets(KamailioError):
    method __init__ (line 15) | def __init__(self, *args, **kwargs):

FILE: gui/modules/api/kamailio/functions.py
  function sendJsonRpcCmd (line 15) | def sendJsonRpcCmd(host, method, params=(), timeout=settings.KAM_JSONRPC...
  function reloadKamailio (line 82) | def reloadKamailio():

FILE: gui/modules/api/licensemanager/classes.py
  function wcApiPropagateHttpError (line 10) | def wcApiPropagateHttpError(method):
  class WoocommerceError (line 21) | class WoocommerceError(requests.HTTPError):
    method __init__ (line 22) | def __init__(self, *args, **kwargs):
    method __str__ (line 24) | def __str__(self):
  class WoocommerceLicense (line 28) | class WoocommerceLicense(object):
    method __init__ (line 42) | def __init__(self, license_key=None, key_combo=None, decrypt=False):
    method __eq__ (line 104) | def __eq__(self, obj):
    method __ne__ (line 108) | def __ne__(self, obj):
    method __iter__ (line 112) | def __iter__(self):
    method asDict (line 117) | def asDict(self):
    method machine_match (line 128) | def machine_match(self):
    method tags (line 132) | def tags(self):
    method expires (line 136) | def expires(self):
    method active (line 145) | def active(self):
    method license_key (line 149) | def license_key(self):
    method valid (line 153) | def valid(self):
    method id (line 157) | def id(self):
    method sync (line 161) | def sync(self):
    method activate (line 191) | def activate(self):
    method deactivate (line 212) | def deactivate(self):
    method hash (line 232) | def hash(self, salt=None):
    method encrypt (line 237) | def encrypt(self):

FILE: gui/modules/api/licensemanager/cli.py
  function main (line 19) | def main():
  function cmdRetrieve (line 43) | def cmdRetrieve(args):
  function cmdList (line 79) | def cmdList(args):
  function cmdActivate (line 101) | def cmdActivate(args):
  function cmdImport (line 127) | def cmdImport(args):
  function cmdDeactivate (line 160) | def cmdDeactivate(args):
  function cmdClear (line 196) | def cmdClear(args):
  function cmdCheck (line 226) | def cmdCheck(args):
  function unknownCmd (line 257) | def unknownCmd():
  function isDsiprouterRunning (line 261) | def isDsiprouterRunning():
  function handleFatalException (line 264) | def handleFatalException(ex_type, ex_value, ex_tb):

FILE: gui/modules/api/licensemanager/functions.py
  function __getLicense (line 15) | def __getLicense(license):
  function quickLoadLicenses (line 18) | def quickLoadLicenses(keystore):
  function licenseDictToStateDict (line 23) | def licenseDictToStateDict(keystore):
  function syncLicensesToGlobalState (line 35) | def syncLicensesToGlobalState():
  function getLicenseStatusFromStateDict (line 38) | def getLicenseStatusFromStateDict(license_state, tag):
  function searchLicenses (line 70) | def searchLicenses(license_key=None, key_combo=None, decrypt=False, lice...
  function getLicenseStatus (line 149) | def getLicenseStatus(license_key=None, license_tag=None, state_dict=None):
  function addToLicenseStore (line 188) | def addToLicenseStore(license, state_dict=None):
  function removeFromLicenseStore (line 199) | def removeFromLicenseStore(license, state_dict=None):

FILE: gui/modules/api/licensemanager/routes.py
  function showWoocommerceError (line 36) | def showWoocommerceError(ex):
  function validateRequestArgs (line 47) | def validateRequestArgs(data, allowed_args=dict(), required_args=set(), ...
  function validateLicense (line 91) | def validateLicense():
  function retrieveLicense (line 163) | def retrieveLicense():
  function listLicenses (line 232) | def listLicenses():
  function activateLicense (line 277) | def activateLicense():
  function deactivateLicense (line 351) | def deactivateLicense():

FILE: gui/modules/api/mediaserver/plugin/fusion/interface.py
  class cos_dialplan (line 10) | class cos_dialplan():
    method __init__ (line 15) | def __init__(self):
    method add (line 18) | def add(self,data):
  class cos (line 32) | class cos():
    method __init__ (line 39) | def __init__(self, domain,data=None):
    method create (line 99) | def create(self, name):
  class mediaserver (line 139) | class mediaserver():
    method __init__ (line 150) | def __init__(self, config):
    method testConnection (line 158) | def testConnection(self):
    method getConnection (line 162) | def getConnection(self):
    method closeConnection (line 172) | def closeConnection(self):
  class domain (line 175) | class domain():
    method toJSON (line 183) | def toJSON(self):
  class domains (line 188) | class domains():
    method __init__ (line 194) | def __init__(self, mediaserver):
    method create (line 198) | def create(self,data):
    method read (line 228) | def read(self,domain_id=None):
    method update (line 256) | def update(self,data):
    method delete (line 277) | def delete(self,domain_id):
    method getExtensions (line 296) | def getExtensions():
  class extension (line 304) | class extension():
    method __init__ (line 319) | def __init__(self):
    method toJSON (line 322) | def toJSON(self):
  class extensions (line 326) | class extensions():
    method __init__ (line 335) | def __init__(self, mediaserver, domain ,extension=None):
    method create (line 342) | def create(self,data):
    method read (line 372) | def read(self, extension_id=None):
    method update (line 401) | def update(self,data):
    method getExtensionID (line 439) | def getExtensionID(self,extension):
    method delete (line 452) | def delete(self,extension):

FILE: gui/modules/api/mediaserver/routes.py
  class config (line 15) | class config():
    method __init__ (line 29) | def __init__(self,config_id):
    method getPlugin (line 78) | def getPlugin(self):
  class FLAGS (line 84) | class FLAGS():
  function getDomains (line 96) | def getDomains(config_id=None,domain_id=None):
  function postDomains (line 169) | def postDomains():
  function putDomains (line 231) | def putDomains():
  function deleteDomains (line 285) | def deleteDomains():
  function postExtensions (line 342) | def postExtensions():
  function putExtensions (line 417) | def putExtensions():
  function getExtensions (line 480) | def getExtensions(config_id=None,domain_id=None,extension_id=None):
  function deleteExtensions (line 549) | def deleteExtensions():

FILE: gui/modules/api/sample_api.py
  function getEntity (line 11) | def getEntity():

FILE: gui/modules/cdr/cdrs.sql
  type `acc` (line 25) | CREATE TABLE `acc` (
  type `cdrs` (line 56) | CREATE TABLE `cdrs` (

FILE: gui/modules/cdr/cron_functions.py
  function sendCdrReport (line 6) | def sendCdrReport(gwgroupid):

FILE: gui/modules/certificates/certificates.sql
  type `dsip_certificates` (line 2) | CREATE TABLE IF NOT EXISTS `dsip_certificates` (

FILE: gui/modules/custom_routing/custom_routing.sql
  type `dr_custom_rules` (line 25) | CREATE TABLE `dr_custom_rules` (
  type `locale_lookup` (line 42) | CREATE TABLE `locale_lookup` (

FILE: gui/modules/dnid_enrichment/dnid_enrichment.sql
  type dsip_dnid_enrich_lnp (line 4) | CREATE TABLE dsip_dnid_enrich_lnp (
  type dsip_dnid_lnp_mapping (line 19) | CREATE VIEW dsip_dnid_lnp_mapping AS

FILE: gui/modules/domain/domain_mapping.sql
  type `dsip_multidomain_mapping` (line 26) | CREATE TABLE `dsip_multidomain_mapping` (
  type `dsip_domain_mapping` (line 51) | CREATE TABLE `dsip_domain_mapping` (

FILE: gui/modules/domain/domain_routes.py
  function gatewayIdToIP (line 23) | def gatewayIdToIP(pbx_id, db):
  function addDomain (line 29) | def addDomain(domain, authtype, pbxs, notes, db):
  function configureMSTeams (line 163) | def configureMSTeams(id):
  function displayDomains (line 215) | def displayDomains():
  function addUpdateDomain (line 294) | def addUpdateDomain():
  function deleteDomain (line 363) | def deleteDomain():

FILE: gui/modules/flowroute/__init__.py
  class Numbers (line 6) | class Numbers():
    method __init__ (line 11) | def __init__(self):
    method __del__ (line 15) | def __del__(self):
    method getNumbers (line 19) | def getNumbers(self, starts_with=None, contains=None, ends_with=None, ...

FILE: gui/modules/frauddetection/fraud.py
  function removeTechPrefix (line 37) | def removeTechPrefix(col):

FILE: gui/modules/fusionpbx/fusionpbx_sync_functions.py
  function get_sources (line 13) | def get_sources(db):
  function drop_fusionpbx_domains (line 40) | def drop_fusionpbx_domains(source, dest):
  function sync_db (line 83) | def sync_db(source, dest):
  function reloadkam (line 215) | def reloadkam():
  function update_nginx (line 223) | def update_nginx(sources):
  function sync_needed (line 319) | def sync_needed(source, dest):
  function run_sync (line 413) | def run_sync(settings):

FILE: gui/modules/upgrade/__init__.py
  class UpdateUtils (line 6) | class UpdateUtils():
    method get_repo_version_list (line 8) | def get_repo_version_list():
    method get_latest_version (line 19) | def get_latest_version():

FILE: gui/shared.py
  function isCertValid (line 15) | def isCertValid(hostname, externalip, port=5061):
  function objToDict (line 38) | def objToDict(obj):
  function rowToDict (line 55) | def rowToDict(row):
  function strFieldsToDict (line 77) | def strFieldsToDict(fields_str, delims=(',', ':')):
  function dictToStrFields (line 82) | def dictToStrFields(fields_dict, delims=(',', ':')):
  function updateConfig (line 87) | def updateConfig(config_obj, field_dict, hot_reload=False):
  function stripDictVals (line 115) | def stripDictVals(d):
  function getCustomRoutes (line 123) | def getCustomRoutes():
  function monthdelta (line 141) | def monthdelta(dt, delta):
  function supportsColor (line 150) | def supportsColor(stream):
  class IO (line 163) | class IO():
    method printerr (line 168) | def printerr(message):
    method printinfo (line 172) | def printinfo(message):
    method printwarn (line 176) | def printwarn(message):
    method printdbg (line 180) | def printdbg(message):
    method printbold (line 184) | def printbold(message):
    method logcrit (line 188) | def logcrit(message):
    method logerr (line 192) | def logerr(message):
    method loginfo (line 196) | def loginfo(message):
    method logwarn (line 200) | def logwarn(message):
    method logdbg (line 204) | def logdbg(message):
    method lognolvl (line 208) | def lognolvl(message):
    method printerr (line 213) | def printerr(message):
    method printinfo (line 217) | def printinfo(message):
    method printwarn (line 221) | def printwarn(message):
    method printdbg (line 225) | def printdbg(message):
    method printbold (line 229) | def printbold(message):
    method logcrit (line 233) | def logcrit(message):
    method logerr (line 237) | def logerr(message):
    method loginfo (line 241) | def loginfo(message):
    method logwarn (line 245) | def logwarn(message):
    method logdbg (line 249) | def logdbg(message):
    method lognolvl (line 253) | def lognolvl(message):
  function debugException (line 256) | def debugException(ex=None, log_ex=True, print_ex=True, showstack=True):
  function debugEndpoint (line 298) | def debugEndpoint(log_out=True, print_out=True, **kwargs):
  function allowed_file (line 371) | def allowed_file(filename, ALLOWED_EXTENSIONS={'csv', 'txt', 'pdf', 'png...
  function showError (line 374) | def showError(type="", code=None, msg=None):
  function redirectCustom (line 378) | def redirectCustom(location, *render_args, code=302, response_cb=None, f...
  function getRequestData (line 463) | def getRequestData():
  class StatusCodes (line 496) | class StatusCodes():

FILE: gui/static/js/backupandrestore.js
  function changeLoadingState (line 24) | function changeLoadingState(isLoading) {
  function downloadResponse (line 33) | function downloadResponse(response, filename) {
  function getFormattedDateTime (line 49) | function getFormattedDateTime() {

FILE: gui/static/js/bootstrap-toggle.js
  function Plugin (line 143) | function Plugin(option) {

FILE: gui/static/js/bootstrap.js
  function transitionEnd (line 34) | function transitionEnd() {
  function removeElement (line 126) | function removeElement() {
  function Plugin (line 142) | function Plugin(option) {
  function Plugin (line 251) | function Plugin(option) {
  function Plugin (line 475) | function Plugin(option) {
  function getTargetFromTrigger (line 695) | function getTargetFromTrigger($trigger) {
  function Plugin (line 707) | function Plugin(option) {
  function getParent (line 774) | function getParent($this) {
  function clearMenus (line 787) | function clearMenus(e) {
  function Plugin (line 880) | function Plugin(option) {
  function Plugin (line 1208) | function Plugin(option, _relatedTarget) {
  function complete (line 1574) | function complete() {
  function Plugin (line 1750) | function Plugin(option) {
  function Plugin (line 1859) | function Plugin(option) {
  function ScrollSpy (line 1902) | function ScrollSpy(element, options) {
  function Plugin (line 2022) | function Plugin(option) {
  function next (line 2131) | function next() {
  function Plugin (line 2177) | function Plugin(option) {
  function Plugin (line 2334) | function Plugin(option) {

FILE: gui/static/js/carriergroups.js
  function validatePluginData (line 31) | function validatePluginData(fields) {
  function addCarrierGroup (line 62) | function addCarrierGroup(action) {
  function updateCarrierGroup (line 172) | function updateCarrierGroup() {
  function setCarrierGroupHandlers (line 213) | function setCarrierGroupHandlers() {
  function setCarrierHandlers (line 412) | function setCarrierHandlers() {
  function setFormHandler (line 497) | function setFormHandler(selector, successCallback) {

FILE: gui/static/js/cdrs.js
  function changeLoadingState (line 22) | function changeLoadingState(isLoading) {
  function getFilteredCdrIds (line 31) | function getFilteredCdrIds() {
  function loadCDRDataTable (line 42) | function loadCDRDataTable(gwgroupid) {

FILE: gui/static/js/certificates.js
  function clear (line 25) | function clear(modal_selector) {
  function addEntity (line 47) | function addEntity(action) {
  function addUploaded (line 85) | function addUploaded (requestPayload,action) {
  function addGenerated (line 135) | function addGenerated(requestPayload,action) {
  function deleteEntity (line 195) | function deleteEntity() {

FILE: gui/static/js/dashboard.js
  function getKamailioStats (line 4) | function getKamailioStats(elem) {

FILE: gui/static/js/datatables.js
  function _fnHungarianMap (line 1667) | function _fnHungarianMap ( o )
  function _fnCamelToHungarian (line 1705) | function _fnCamelToHungarian ( src, user, force )
  function _fnLanguageCompat (line 1744) | function _fnLanguageCompat( lang )
  function _fnCompatOpts (line 1806) | function _fnCompatOpts ( init )
  function _fnCompatCols (line 1847) | function _fnCompatCols ( init )
  function _fnBrowserDetect (line 1867) | function _fnBrowserDetect( settings )
  function _fnReduce (line 1947) | function _fnReduce ( that, fn, init, start, end, inc )
  function _fnAddColumn (line 1981) | function _fnAddColumn( oSettings, nTh )
  function _fnColumnOptions (line 2013) | function _fnColumnOptions( oSettings, iCol, oOptions )
  function _fnAdjustColumnSizing (line 2144) | function _fnAdjustColumnSizing ( settings )
  function _fnVisibleToColumnIndex (line 2176) | function _fnVisibleToColumnIndex( oSettings, iMatch )
  function _fnColumnIndexToVisible (line 2194) | function _fnColumnIndexToVisible( oSettings, iMatch )
  function _fnVisbleColumns (line 2209) | function _fnVisbleColumns( oSettings )
  function _fnGetColumns (line 2232) | function _fnGetColumns( oSettings, sParam )
  function _fnColumnTypes (line 2251) | function _fnColumnTypes ( settings )
  function _fnApplyColumnDefs (line 2322) | function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
  function _fnAddData (line 2402) | function _fnAddData ( oSettings, aDataIn, nTr, anTds )
  function _fnAddTr (line 2452) | function _fnAddTr( settings, trs )
  function _fnNodeToDataIndex (line 2475) | function _fnNodeToDataIndex( oSettings, n )
  function _fnNodeToColumnIndex (line 2489) | function _fnNodeToColumnIndex( oSettings, iRow, n )
  function _fnGetCellData (line 2504) | function _fnGetCellData( settings, rowIdx, colIdx, type )
  function _fnSetCellData (line 2552) | function _fnSetCellData( settings, rowIdx, colIdx, val )
  function _fnSplitObjNotation (line 2574) | function _fnSplitObjNotation( str )
  function _fnGetObjectDataFn (line 2589) | function _fnGetObjectDataFn( mSource )
  function _fnSetObjectDataFn (line 2714) | function _fnSetObjectDataFn( mSource )
  function _fnGetDataMaster (line 2833) | function _fnGetDataMaster ( settings )
  function _fnClearTable (line 2844) | function _fnClearTable( settings )
  function _fnDeleteIndex (line 2860) | function _fnDeleteIndex( a, iTarget, splice )
  function _fnInvalidate (line 2899) | function _fnInvalidate( settings, rowIdx, src, colIdx )
  function _fnGetRowElements (line 2977) | function _fnGetRowElements( settings, row, colIdx, d )
  function _fnCreateTr (line 3086) | function _fnCreateTr ( oSettings, iRow, nTrIn, anTds )
  function _fnRowAttributes (line 3171) | function _fnRowAttributes( settings, row )
  function _fnBuildHead (line 3211) | function _fnBuildHead( oSettings )
  function _fnDrawHead (line 3297) | function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
  function _fnDraw (line 3395) | function _fnDraw( oSettings )
  function _fnReDraw (line 3536) | function _fnReDraw( settings, holdPosition )
  function _fnAddOptionsHtml (line 3574) | function _fnAddOptionsHtml ( oSettings )
  function _fnDetectHeader (line 3730) | function _fnDetectHeader ( aLayout, nThead )
  function _fnGetUniqueThs (line 3805) | function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
  function _fnBuildAjax (line 3842) | function _fnBuildAjax( oSettings, data, fn )
  function _fnAjaxUpdate (line 3975) | function _fnAjaxUpdate( settings )
  function _fnAjaxParameters (line 4006) | function _fnAjaxParameters( settings )
  function _fnAjaxUpdateDraw (line 4114) | function _fnAjaxUpdateDraw ( settings, json )
  function _fnAjaxDataSrc (line 4164) | function _fnAjaxDataSrc ( oSettings, json )
  function _fnFeatureHtmlFilter (line 4187) | function _fnFeatureHtmlFilter ( settings )
  function _fnFilterComplete (line 4283) | function _fnFilterComplete ( oSettings, oInput, iForce )
  function _fnFilterCustom (line 4336) | function _fnFilterCustom( settings )
  function _fnFilterColumn (line 4373) | function _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, ca...
  function _fnFilter (line 4406) | function _fnFilter( settings, input, force, regex, smart, caseInsensitive )
  function _fnFilterCreateSearch (line 4462) | function _fnFilterCreateSearch( search, regex, smart, caseInsensitive )
  function _fnFilterData (line 4504) | function _fnFilterData ( settings )
  function _fnSearchToCamel (line 4577) | function _fnSearchToCamel ( obj )
  function _fnSearchToHung (line 4596) | function _fnSearchToHung ( obj )
  function _fnFeatureHtmlInfo (line 4612) | function _fnFeatureHtmlInfo ( settings )
  function _fnUpdateInfo (line 4646) | function _fnUpdateInfo ( settings )
  function _fnInfoMacros (line 4684) | function _fnInfoMacros ( settings, str )
  function _fnInitialise (line 4711) | function _fnInitialise ( settings )
  function _fnInitComplete (line 4795) | function _fnInitComplete ( settings, json )
  function _fnLengthChange (line 4810) | function _fnLengthChange ( settings, val )
  function _fnFeatureHtmlLength (line 4828) | function _fnFeatureHtmlLength ( settings )
  function _fnFeatureHtmlPaginate (line 4894) | function _fnFeatureHtmlPaginate ( settings )
  function _fnPageChange (line 4955) | function _fnPageChange ( settings, action, redraw )
  function _fnFeatureHtmlProcessing (line 5028) | function _fnFeatureHtmlProcessing ( settings )
  function _fnProcessingDisplay (line 5045) | function _fnProcessingDisplay ( settings, show )
  function _fnFeatureHtmlTable (line 5060) | function _fnFeatureHtmlTable ( settings )
  function _fnScrollDraw (line 5218) | function _fnScrollDraw ( settings )
  function _fnApplyToChildren (line 5501) | function _fnApplyToChildren( fn, an1, an2 )
  function _fnCalculateColumnWidths (line 5540) | function _fnCalculateColumnWidths ( oSettings )
  function _fnConvertToWidth (line 5778) | function _fnConvertToWidth ( width, parent )
  function _fnGetWidestNode (line 5802) | function _fnGetWidestNode( settings, colIdx )
  function _fnGetMaxLenString (line 5823) | function _fnGetMaxLenString( settings, colIdx )
  function _fnStringToCss (line 5848) | function _fnStringToCss( s )
  function _fnSortFlatten (line 5868) | function _fnSortFlatten ( settings )
  function _fnSort (line 5940) | function _fnSort ( oSettings )
  function _fnSortAria (line 6066) | function _fnSortAria ( settings )
  function _fnSortListener (line 6121) | function _fnSortListener ( settings, colIdx, append, callback )
  function _fnSortAttachListener (line 6205) | function _fnSortAttachListener ( settings, attachTo, colIdx, callback )
  function _fnSortingClasses (line 6243) | function _fnSortingClasses( settings )
  function _fnSortData (line 6276) | function _fnSortData( settings, idx )
  function _fnSaveState (line 6319) | function _fnSaveState ( settings )
  function _fnLoadState (line 6355) | function _fnLoadState ( settings, oInit, callback )
  function _fnSettingsFromNode (line 6457) | function _fnSettingsFromNode ( table )
  function _fnLog (line 6476) | function _fnLog( settings, level, msg, tn )
  function _fnMap (line 6519) | function _fnMap( ret, src, name, mappedName )
  function _fnExtend (line 6561) | function _fnExtend( out, extender, breakRefs )
  function _fnBindAction (line 6597) | function _fnBindAction( n, oData, fn )
  function _fnCallbackReg (line 6626) | function _fnCallbackReg( oSettings, sStore, fn, sName )
  function _fnCallbackFire (line 6652) | function _fnCallbackFire( settings, callbackArr, eventName, args )
  function _fnLengthOverflow (line 6674) | function _fnLengthOverflow ( settings )
  function _fnRenderer (line 6699) | function _fnRenderer( settings, type )
  function _fnDataSource (line 6728) | function _fnDataSource ( settings )
  function _numbers (line 14506) | function _numbers ( page, pages ) {
  function _addNumericSort (line 14811) | function _addNumericSort ( decimalPlace ) {
  function _fnExternApiFunc (line 15066) | function _fnExternApiFunc (fn)

FILE: gui/static/js/domains.js
  function processDomainType (line 4) | function processDomainType(value) {
  function validateDomainFormFields (line 24) | function validateDomainFormFields(fields) {
  function updateModals (line 44) | function updateModals() {

FILE: gui/static/js/endpointgroups.js
  function generateEndpointObject (line 63) | function generateEndpointObject(row) {
  function generateEndpointMarkup (line 82) | function generateEndpointMarkup(endpoint = null) {
  function generateEndpointTable (line 109) | function generateEndpointTable(selector) {
  function addEndpointGroup (line 134) | function addEndpointGroup(action) {
  function updateEndpointGroup (line 275) | function updateEndpointGroup() {
  function clearEndpointGroupModal (line 279) | function clearEndpointGroupModal(modal_selector) {
  function displayEndpointGroup (line 345) | function displayEndpointGroup(gwgroup_data) {
  function deleteEndpointGroup (line 419) | function deleteEndpointGroup() {

FILE: gui/static/js/highlight/highlight.pack.js
  function n (line 2) | function n(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replac...
  function t (line 2) | function t(e){return e.nodeName.toLowerCase()}
  function r (line 2) | function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}
  function a (line 2) | function a(e){return k.test(e)}
  function i (line 2) | function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentN...
  function o (line 2) | function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n...
  function u (line 2) | function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i...
  function c (line 2) | function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r...
  function l (line 2) | function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map...
  function s (line 2) | function s(e){function n(e){return e&&e.source||e}function t(t,r){return...
  function f (line 2) | function f(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++...
  function g (line 2) | function g(e,t){t=t||I.languages||x(y);var r={r:0,value:n(e)},a=r;return...
  function p (line 2) | function p(e){return I.tabReplace||I.useBR?e.replace(M,function(e,n){ret...
  function h (line 2) | function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)...
  function d (line 2) | function d(e){var n,t,r,o,l,s=i(e);a(s)||(I.useBR?(n=document.createElem...
  function b (line 2) | function b(e){I=o(I,e)}
  function v (line 2) | function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("...
  function m (line 2) | function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener(...
  function N (line 2) | function N(n,t){var r=y[n]=t(e);r.aliases&&r.aliases.forEach(function(e)...
  function R (line 2) | function R(){return x(y)}
  function w (line 2) | function w(e){return e=(e||"").toLowerCase(),y[e]||y[L[e]]}

FILE: gui/static/js/inboundmapping.js
  function searchDIDs (line 22) | function searchDIDs(search) {
  function comboboxInit (line 39) | function comboboxInit(parent_selector) {

FILE: gui/static/js/jquery.js
  function DOMEval (line 97) | function DOMEval( code, doc, node ) {
  function toType (line 115) | function toType( obj ) {
  function isArrayLike (line 483) | function isArrayLike( obj ) {
  function Sizzle (line 715) | function Sizzle( selector, context, results, seed ) {
  function createCache (line 854) | function createCache() {
  function markFunction (line 872) | function markFunction( fn ) {
  function assert (line 881) | function assert( fn ) {
  function addHandle (line 903) | function addHandle( attrs, handler ) {
  function siblingCheck (line 918) | function siblingCheck( a, b ) {
  function createInputPseudo (line 944) | function createInputPseudo( type ) {
  function createButtonPseudo (line 955) | function createButtonPseudo( type ) {
  function createDisabledPseudo (line 966) | function createDisabledPseudo( disabled ) {
  function createPositionalPseudo (line 1022) | function createPositionalPseudo( fn ) {
  function testContext (line 1045) | function testContext( context ) {
  function setFilters (line 2127) | function setFilters() {}
  function toSelector (line 2198) | function toSelector( tokens ) {
  function addCombinator (line 2208) | function addCombinator( matcher, combinator, base ) {
  function elementMatcher (line 2272) | function elementMatcher( matchers ) {
  function multipleContexts (line 2286) | function multipleContexts( selector, contexts, results ) {
  function condense (line 2295) | function condense( unmatched, map, filter, context, xml ) {
  function setMatcher (line 2316) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
  function matcherFromTokens (line 2409) | function matcherFromTokens( tokens ) {
  function matcherFromGroupMatchers (line 2467) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  function nodeName (line 2803) | function nodeName( elem, name ) {
  function winnow (line 2813) | function winnow( elements, qualifier, not ) {
  function sibling (line 3108) | function sibling( cur, dir ) {
  function createOptions (line 3195) | function createOptions( options ) {
  function Identity (line 3420) | function Identity( v ) {
  function Thrower (line 3423) | function Thrower( ex ) {
  function adoptValue (line 3427) | function adoptValue( value, resolve, reject, noValue ) {
  function resolve (line 3520) | function resolve( depth, deferred, handler, special ) {
  function completed (line 3885) | function completed() {
  function fcamelCase (line 3980) | function fcamelCase( all, letter ) {
  function camelCase (line 3987) | function camelCase( string ) {
  function Data (line 4004) | function Data() {
  function getData (line 4173) | function getData( data ) {
  function dataAttr (line 4198) | function dataAttr( elem, key, data ) {
  function adjustCSS (line 4511) | function adjustCSS( elem, prop, valueParts, tween ) {
  function getDefaultDisplay (line 4578) | function getDefaultDisplay( elem ) {
  function showHide (line 4601) | function showHide( elements, show ) {
  function getAll (line 4702) | function getAll( context, tag ) {
  function setGlobalEval (line 4727) | function setGlobalEval( elems, refElements ) {
  function buildFragment (line 4743) | function buildFragment( elems, context, scripts, selection, ignored ) {
  function returnTrue (line 4866) | function returnTrue() {
  function returnFalse (line 4870) | function returnFalse() {
  function safeActiveElement (line 4876) | function safeActiveElement() {
  function on (line 4882) | function on( elem, types, selector, data, fn, one ) {
  function manipulationTarget (line 5610) | function manipulationTarget( elem, content ) {
  function disableScript (line 5621) | function disableScript( elem ) {
  function restoreScript (line 5625) | function restoreScript( elem ) {
  function cloneCopyEvent (line 5635) | function cloneCopyEvent( src, dest ) {
  function fixInput (line 5670) | function fixInput( src, dest ) {
  function domManip (line 5683) | function domManip( collection, args, callback, ignored ) {
  function remove (line 5773) | function remove( elem, selector, keepData ) {
  function computeStyleTests (line 6066) | function computeStyleTests() {
  function roundPixelMeasures (line 6108) | function roundPixelMeasures( measure ) {
  function curCSS (line 6153) | function curCSS( elem, name, computed ) {
  function addGetHookIf (line 6206) | function addGetHookIf( conditionFn, hookFn ) {
  function vendorPropName (line 6243) | function vendorPropName( name ) {
  function finalPropName (line 6264) | function finalPropName( name ) {
  function setPositiveNumber (line 6272) | function setPositiveNumber( elem, value, subtract ) {
  function boxModelAdjustment (line 6284) | function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, ...
  function getWidthOrHeight (line 6349) | function getWidthOrHeight( elem, dimension, extra ) {
  function Tween (line 6682) | function Tween( elem, options, prop, end, easing ) {
  function schedule (line 6805) | function schedule() {
  function createFxNow (line 6818) | function createFxNow() {
  function genFx (line 6826) | function genFx( type, includeWidth ) {
  function createTween (line 6846) | function createTween( value, prop, animation ) {
  function defaultPrefilter (line 6860) | function defaultPrefilter( elem, props, opts ) {
  function propFilter (line 7032) | function propFilter( props, specialEasing ) {
  function Animation (line 7069) | function Animation( elem, properties, options ) {
  function stripAndCollapse (line 7784) | function stripAndCollapse( value ) {
  function getClass (line 7790) | function getClass( elem ) {
  function classesToArray (line 7794) | function classesToArray( value ) {
  function buildParams (line 8416) | function buildParams( prefix, obj, traditional, add ) {
  function addToPrefiltersOrTransports (line 8566) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 8600) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 8629) | function ajaxExtend( target, src ) {
  function ajaxHandleResponses (line 8649) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 8707) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
  function done (line 9220) | function done( status, nativeStatusText, responses, headers ) {

FILE: gui/static/js/jquery.tabledit.js
  function ajax (line 388) | function ajax(action)

FILE: gui/static/js/license_manager.js
  function activateLicense (line 25) | function activateLicense() {
  function deactivateLicense (line 64) | function deactivateLicense() {
  function updateDeleteModal (line 101) | function updateDeleteModal(self=null) {
  function togglePasswordHidden (line 124) | function togglePasswordHidden(self=null) {
  function createDeleteButton (line 153) | function createDeleteButton() {
  function createLicenseKeyField (line 162) | function createLicenseKeyField(data, type, row, meta) {
  function createReadonlyInputField (line 172) | function createReadonlyInputField(data, type, row, meta) {
  function createReadonlyTextArea (line 179) | function createReadonlyTextArea(data, type, row, meta) {
  function dtDrawCallback (line 186) | function dtDrawCallback(settings) {
  function hideModal (line 192) | function hideModal(selector) {

FILE: gui/static/js/msteams.js
  function updateConnectivtyStatus (line 5) | function updateConnectivtyStatus(msg) {
  function openNav (line 61) | function openNav() {
  function closeNav (line 66) | function closeNav() {
  function runTests (line 70) | function runTests() {

FILE: gui/static/js/stirshaken.js
  function updateToggle (line 7) | function updateToggle() {

FILE: gui/static/js/transnexus.js
  function updateToggle (line 4) | function updateToggle(toggle_node, settings_node) {

FILE: gui/static/js/upgrade.js
  function displayUpgradeLog (line 13) | function displayUpgradeLog() {
  function streamLog (line 19) | function streamLog() {
  function dumpLog (line 29) | function dumpLog() {
  function monitorUpgrade (line 39) | function monitorUpgrade() {

FILE: gui/static/js/util.js
  function hasEventListener (line 190) | function hasEventListener(selector, event) {

FILE: gui/static/js/validator.js
  function getValue (line 15) | function getValue($el) {
  function getValidatorSpecificError (line 159) | function getValidatorSpecificError(key) {
  function getValidityStateError (line 163) | function getValidityStateError() {
  function getGenericError (line 174) | function getGenericError() {
  function getErrorMessage (line 178) | function getErrorMessage(key) {
  function fieldErrors (line 270) | function fieldErrors() {
  function fieldIncomplete (line 278) | function fieldIncomplete() {
  function Plugin (line 357) | function Plugin(option) {

FILE: gui/sysloginit.py
  function initSyslogLogger (line 6) | def initSyslogLogger():

FILE: gui/templates/includes/overrides.js
  function requestErrorHandler (line 30) | function requestErrorHandler(status, error_msg, error_type="http") {

FILE: gui/util/conversions.py
  function expand_prefix (line 9) | def expand_prefix(prefix, suffix_check=None):
  function expand_prefixs (line 64) | def expand_prefixs(prefixs):

FILE: gui/util/cron.py
  function getTaggedCronjob (line 7) | def getTaggedCronjob(tag):
  function addTaggedCronjob (line 24) | def addTaggedCronjob(tag, interval, cmd):
  function updateTaggedCronjob (line 61) | def updateTaggedCronjob(tag, interval='', cmd='', new_tag=''):
  function deleteTaggedCronjob (line 109) | def deleteTaggedCronjob(tag):
  function cronIntervalToDescription (line 136) | def cronIntervalToDescription(interval):

FILE: gui/util/file_handling.py
  function isValidFile (line 13) | def isValidFile(filename, filetype='any'):
  function saveUpload (line 37) | def saveUpload(file, savedir, filetype):
  function change_permissions_recursive (line 72) | def change_permissions_recursive(path, mode):
  function change_owner (line 79) | def change_owner(path,user,group):

FILE: gui/util/ipc.py
  function createSharedMemoryDict (line 15) | def createSharedMemoryDict(val, name):
  function getSharedMemoryDict (line 28) | def getSharedMemoryDict(name):
  function sendSyncSettingsSignal (line 39) | def sendSyncSettingsSignal(pid_file=settings.DSIP_PID_FILE, load_shared_...

FILE: gui/util/kamtls.py
  function createCustomTLSConfig (line 20) | def createCustomTLSConfig(domain, ip, port, server_name_mode):
  function getCustomTLSConfigs (line 66) | def getCustomTLSConfigs(domain_filter=None):
  function addCustomTLSConfig (line 127) | def addCustomTLSConfig(domain, ip='', port=5061, server_name_mode=KAM_TL...
  function updateCustomTLSConfig (line 161) | def updateCustomTLSConfig(domain, ip=None, port=None, server_name_mode=N...
  function deleteCustomTLSConfig (line 199) | def deleteCustomTLSConfig(domain):

FILE: gui/util/letsencrypt.py
  function new_csr (line 44) | def new_csr(domain_name, pkey_pem=None):
  function select_http01_chall (line 54) | def select_http01_chall(orderr):
  function challenge_server (line 64) | def challenge_server(http_01_resources):
  function perform_http01 (line 79) | def perform_http01(client_acme, challb, orderr):
  function generateCertificate (line 98) | def generateCertificate(domain, notification_email, directory_url=DIRECT...
  function deleteCertificate (line 158) | def deleteCertificate(domain, directory_url=DIRECTORY_URL_PROD, cert_dir...

FILE: gui/util/networking.py
  function ipv4Test (line 30) | def ipv4Test(address):
  function ipv6Test (line 44) | def ipv6Test(address):
  function isValidIP (line 52) | def isValidIP(address, ip_ver=''):
  function getInternalIP (line 64) | def getInternalIP(ip_ver=''):
  function getExternalIP (line 94) | def getExternalIP(ip_ver=''):
  function hostToIP (line 149) | def hostToIP(host, ip_ver=''):
  function ipToHost (line 176) | def ipToHost(ip, exclude_dsip_aliases=True):
  function encodeSipUser (line 196) | def encodeSipUser(user):
  function decodeSipUser (line 199) | def decodeSipUser(user):
  function parseSipUri (line 202) | def parseSipUri(uri):
  function parseGenericUri (line 249) | def parseGenericUri(uri):
  function safeUriToHost (line 297) | def safeUriToHost(uri, default_port=None):
  function safeStripPort (line 338) | def safeStripPort(address):
  function safeFormatSipUri (line 364) | def safeFormatSipUri(uri, default_proto='sip', default_user='', default_...
  function getRoutingTableIPv4 (line 408) | def getRoutingTableIPv4():
  function getRoutingTableIPv6 (line 438) | def getRoutingTableIPv6():
  function ipToInt (line 470) | def ipToInt(ip_str):
  function ipToStr (line 489) | def ipToStr(ip_int):
  function netMaskToPrefixLen (line 508) | def netMaskToPrefixLen(mask):
  function prefixLenToNetMask (line 526) | def prefixLenToNetMask(prefixlen):
  function getInternalCIDR (line 545) | def getInternalCIDR(ip_ver=''):

FILE: gui/util/notifications.py
  function sendEmail (line 17) | def sendEmail(recipients, text_body, html_body=None, subject=settings.MA...

FILE: gui/util/parse_json.py
  function CreateEncoder (line 11) | def CreateEncoder(revisit_self=False, fields_to_expand=(), fields_to_rem...

FILE: gui/util/persistence.py
  function getPersistentState (line 7) | def getPersistentState():
  function setPersistentState (line 14) | def setPersistentState(state):
  function updatePersistentState (line 18) | def updatePersistentState(updates):

FILE: gui/util/pyasync.py
  class ThreadingIter (line 8) | class ThreadingIter():
    method __init__ (line 14) | def __init__(self, iter):
    method __iter__ (line 18) | def __iter__(self):
    method next (line 21) | def next(self):
  function thread (line 26) | def thread(func):
  function process (line 39) | def process(func):
  function daemonize (line 53) | def daemonize(cmd, timeout=300):
  function mpexec (line 88) | def mpexec(func, args=None, kwargs=None, workers=None, callback=None):
  function mtexec (line 124) | def mtexec(func, args=None, kwargs=None, workers=None, callback=None):

FILE: gui/util/security.py
  function urandomChars (line 23) | def urandomChars(length=32):
  class Credentials (line 37) | class Credentials():
    method hashCreds (line 51) | def hashCreds(creds, salt=None, dklen=None):
    method setCreds (line 93) | def setCreds(dsip_creds=b'', api_creds=b'', kam_creds=b'', mail_creds=...
  class AES_CTR (line 162) | class AES_CTR():
    method genKey (line 176) | def genKey(keyfile=settings.DSIP_PRIV_KEY):
    method encrypt (line 182) | def encrypt(byte_string, key_file=settings.DSIP_PRIV_KEY):
    method decrypt (line 196) | def decrypt(byte_string, key_file=settings.DSIP_PRIV_KEY, decode=True):
  class APIToken (line 212) | class APIToken:
    method __init__ (line 215) | def __init__(self, request):
    method isValid (line 223) | def isValid(self):
  class CryptoLibInfo (line 244) | class CryptoLibInfo():
    method getOpenSSLVer (line 250) | def getOpenSSLVer():
    method getSupportedSSLProtocols (line 260) | def getSupportedSSLProtocols():
  class KeyCertPair (line 280) | class KeyCertPair():
    method __init__ (line 290) | def __init__(self, files):
    method readFile (line 325) | def readFile(file):
    method convertPKCS7CertToX509List (line 339) | def convertPKCS7CertToX509List(pkcs7_cert):
    method convertKeyBuffToPkey (line 372) | def convertKeyBuffToPkey(buff):
    method convertCertBuffToX509List (line 406) | def convertCertBuffToX509List(buff):
    method getCertSubjectPrintable (line 456) | def getCertSubjectPrintable(cert):
    method validateKeyCertPair (line 459) | def validateKeyCertPair(self):
    method dumpPkey (line 480) | def dumpPkey(self, encoding=OpenSSL.crypto.FILETYPE_PEM):
    method dumpCerts (line 483) | def dumpCerts(self, encoding=OpenSSL.crypto.FILETYPE_PEM):

FILE: gui/util/time_funcs.py
  function convert_ts (line 9) | def convert_ts(ts, millis=False, is_utc=False):
  function utcnow (line 55) | def utcnow(format="ts"):

FILE: kamailio/defaults/dsip_call_settings.sql
  type `dsip_call_settings` (line 4) | CREATE TABLE `dsip_call_settings` (
  type `dsip_call_settings_h` (line 16) | CREATE VIEW `dsip_call_settings_h` AS

FILE: kamailio/defaults/dsip_cdrinfo.sql
  type `dsip_cdrinfo` (line 4) | CREATE TABLE `dsip_cdrinfo` (

FILE: kamailio/defaults/dsip_forwarding.sql
  type dsip_hardfwd (line 5) | CREATE TABLE dsip_hardfwd (
  type dsip_failfwd (line 20) | CREATE TABLE dsip_failfwd (
  type dsip_prefix_mapping (line 35) | CREATE VIEW dsip_prefix_mapping AS

FILE: kamailio/defaults/dsip_gw2gwgroup.sql
  type dsip_gw2gwgroup (line 4) | CREATE TABLE dsip_gw2gwgroup (

FILE: kamailio/defaults/dsip_gwgroup2lb.sql
  type dsip_gwgroup2lb (line 2) | CREATE TABLE dsip_gwgroup2lb (

FILE: kamailio/defaults/dsip_lcr.sql
  type `dsip_lcr` (line 4) | CREATE TABLE `dsip_lcr` (

FILE: kamailio/defaults/dsip_maintmode.sql
  type `dsip_maintmode` (line 4) | CREATE TABLE `dsip_maintmode` (

FILE: kamailio/defaults/dsip_notification.sql
  type `dsip_notification` (line 4) | CREATE TABLE `dsip_notification` (

FILE: kamailio/defaults/dsip_settings.sql
  type dsip_settings (line 11) | CREATE TABLE dsip_settings

FILE: kamailio/modules/dsiprouter/mod_dsiprouter.c
  function mod_init (line 85) | static int mod_init(void) {
  function mod_child_init (line 94) | static int mod_child_init(int rank) {
  function mod_destroy (line 98) | static void mod_destroy(void) {
  function fixup_get_params (line 102) | static int fixup_get_params(void **param, int param_no) {
  function fixup_get_params_free (line 110) | static int fixup_get_params_free(void **param, int param_no) {
  function mod_health_check (line 118) | static int mod_health_check() {
  function rpc_health_check (line 122) | static void rpc_health_check(rpc_t *rpc, void *ctx) {

FILE: kamailio/modules/dsiprouter/mod_funcs.c
  function RSA (line 155) | RSA *createRSA(unsigned char *key, int public) {
  function verifyRSA (line 189) | int verifyRSA(const unsigned char *msg, size_t msglen, unsigned char *si...
  function validate_license (line 221) | int validate_license(char *license_file, char *signature_file, char *uui...
  function main (line 284) | int main() {

FILE: resources/git/check_syntax.py
  function haveValidSyntax (line 56) | def haveValidSyntax(test_files, syntax='c-src'):
  function printSummary (line 111) | def printSummary():
  function printErrorBlock (line 122) | def printErrorBlock(header, test_results):
  function printErrorInfo (line 133) | def printErrorInfo():
  function printResultsAndExit (line 148) | def printResultsAndExit():

FILE: resources/mysql/asterisk-realtime-config.sql
  type `bit_ast_config` (line 11) | CREATE TABLE `bit_ast_config` (
  type `bit_sip_buddies` (line 28) | CREATE TABLE `bit_sip_buddies` (
  type `sipfriends` (line 83) | CREATE TABLE IF NOT EXISTS `sipfriends` (
  type bit_iax_buddies (line 181) | CREATE TABLE bit_iax_buddies (
  type bit_iax_buddies_username_idx (line 209) | CREATE UNIQUE INDEX bit_iax_buddies_username_idx ON bit_iax_buddies(user...
  type h323_peer (line 217) | CREATE TABLE h323_peer(
  type `bit_voicemail` (line 243) | CREATE TABLE `bit_voicemail` (
  type queue_table (line 298) | CREATE TABLE queue_table (
  type `bit_extensions_table` (line 341) | CREATE TABLE `bit_extensions_table` (
  type `bit_meetme` (line 360) | CREATE TABLE `bit_meetme` (
  type `sccpdevices` (line 372) | CREATE TABLE `sccpdevices` (
  type `sccplines` (line 390) | CREATE TABLE `sccplines` (
  type `extensions` (line 425) | CREATE TABLE `extensions` (
  type `voicemail` (line 437) | CREATE TABLE `voicemail` (
  type `sip` (line 465) | CREATE TABLE `sip` (
  type `pins` (line 509) | CREATE TABLE `pins` (

FILE: resources/upgrade/v0.75/pre_import_data.sql
  type `dsip_calllimit` (line 1) | CREATE TABLE `dsip_calllimit` (

FILE: resources/upgrade/v0.78/dsip-fwd-new.sql
  type dsip_prefix_mapping (line 3) | CREATE VIEW dsip_prefix_mapping AS

FILE: resources/upgrade/v0.78/dsip-fwd-old.sql
  type dsip_prefix_mapping (line 3) | CREATE VIEW dsip_prefix_mapping AS

FILE: testing/sql/v0.522/kamailio.sql
  type `acc` (line 25) | CREATE TABLE `acc` (
  type `acc_cdrs` (line 63) | CREATE TABLE `acc_cdrs` (
  type `active_watchers` (line 89) | CREATE TABLE `active_watchers` (
  type `address` (line 142) | CREATE TABLE `address` (
  type `aliases` (line 170) | CREATE TABLE `aliases` (
  type `carrier_name` (line 217) | CREATE TABLE `carrier_name` (
  type `carrierfailureroute` (line 240) | CREATE TABLE `carrierfailureroute` (
  type `carrierroute` (line 271) | CREATE TABLE `carrierroute` (
  type `cdrs` (line 304) | CREATE TABLE `cdrs` (
  type `cpl` (line 342) | CREATE TABLE `cpl` (
  type `dbaliases` (line 369) | CREATE TABLE `dbaliases` (
  type `dialog` (line 398) | CREATE TABLE `dialog` (
  type `dialog_vars` (line 444) | CREATE TABLE `dialog_vars` (
  type `dialplan` (line 471) | CREATE TABLE `dialplan` (
  type `dispatcher` (line 501) | CREATE TABLE `dispatcher` (
  type `domain` (line 529) | CREATE TABLE `domain` (
  type `domain_attrs` (line 555) | CREATE TABLE `domain_attrs` (
  type `domain_name` (line 583) | CREATE TABLE `domain_name` (
  type `domainpolicy` (line 606) | CREATE TABLE `domainpolicy` (
  type `dr_custom_rules` (line 635) | CREATE TABLE `dr_custom_rules` (
  type `dr_gateways` (line 661) | CREATE TABLE `dr_gateways` (
  type `dr_groups` (line 690) | CREATE TABLE `dr_groups` (
  type `dr_gw_lists` (line 716) | CREATE TABLE `dr_gw_lists` (
  type `dr_rules` (line 741) | CREATE TABLE `dr_rules` (
  type `dsip_calllimit` (line 771) | CREATE TABLE `dsip_calllimit` (
  type `dsip_domain_mapping` (line 798) | CREATE TABLE `dsip_domain_mapping` (
  type `dsip_endpoint_lease` (line 825) | CREATE TABLE `dsip_endpoint_lease` (
  type `dsip_lcr` (line 850) | CREATE TABLE `dsip_lcr` (
  type `dsip_maintmode` (line 878) | CREATE TABLE `dsip_maintmode` (
  type `dsip_multidomain_mapping` (line 904) | CREATE TABLE `dsip_multidomain_mapping` (
  type `dsip_notification` (line 937) | CREATE TABLE `dsip_notification` (
  type `globalblacklist` (line 963) | CREATE TABLE `globalblacklist` (
  type `grp` (line 989) | CREATE TABLE `grp` (
  type `htable` (line 1016) | CREATE TABLE `htable` (
  type `imc_members` (line 1043) | CREATE TABLE `imc_members` (
  type `imc_rooms` (line 1070) | CREATE TABLE `imc_rooms` (
  type `lcr_gw` (line 1096) | CREATE TABLE `lcr_gw` (
  type `lcr_rule` (line 1132) | CREATE TABLE `lcr_rule` (
  type `lcr_rule_target` (line 1162) | CREATE TABLE `lcr_rule_target` (
  type `locale_lookup` (line 1191) | CREATE TABLE `locale_lookup` (
  type `location` (line 1216) | CREATE TABLE `location` (
  type `location_attrs` (line 1264) | CREATE TABLE `location_attrs` (
  type `missed_calls` (line 1295) | CREATE TABLE `missed_calls` (
  type `mohqcalls` (line 1325) | CREATE TABLE `mohqcalls` (
  type `mohqueues` (line 1354) | CREATE TABLE `mohqueues` (
  type `mtree` (line 1383) | CREATE TABLE `mtree` (
  type `mtrees` (line 1408) | CREATE TABLE `mtrees` (
  type `pdt` (line 1434) | CREATE TABLE `pdt` (
  type `pl_pipes` (line 1460) | CREATE TABLE `pl_pipes` (
  type `presentity` (line 1485) | CREATE TABLE `presentity` (
  type `pua` (line 1519) | CREATE TABLE `pua` (
  type `purplemap` (line 1564) | CREATE TABLE `purplemap` (
  type `re_grp` (line 1590) | CREATE TABLE `re_grp` (
  type `rls_presentity` (line 1615) | CREATE TABLE `rls_presentity` (
  type `rls_watchers` (line 1649) | CREATE TABLE `rls_watchers` (
  type `rtpengine` (line 1698) | CREATE TABLE `rtpengine` (
  type `rtpproxy` (line 1726) | CREATE TABLE `rtpproxy` (
  type `sca_subscriptions` (line 1753) | CREATE TABLE `sca_subscriptions` (
  type `silo` (line 1791) | CREATE TABLE `silo` (
  type `sip_trace` (line 1826) | CREATE TABLE `sip_trace` (
  type `speed_dial` (line 1864) | CREATE TABLE `speed_dial` (
  type `subscriber` (line 1895) | CREATE TABLE `subscriber` (
  type `topos_d` (line 1926) | CREATE TABLE `topos_d` (
  type `topos_t` (line 1975) | CREATE TABLE `topos_t` (
  type `trusted` (line 2025) | CREATE TABLE `trusted` (
  type `uacreg` (line 2054) | CREATE TABLE `uacreg` (
  type `uid_credentials` (line 2091) | CREATE TABLE `uid_credentials` (
  type `uid_domain` (line 2125) | CREATE TABLE `uid_domain` (
  type `uid_domain_attrs` (line 2152) | CREATE TABLE `uid_domain_attrs` (
  type `uid_global_attrs` (line 2181) | CREATE TABLE `uid_global_attrs` (
  type `uid_uri` (line 2208) | CREATE TABLE `uid_uri` (
  type `uid_uri_attrs` (line 2237) | CREATE TABLE `uid_uri_attrs` (
  type `uid_user_attrs` (line 2267) | CREATE TABLE `uid_user_attrs` (
  type `uri` (line 2295) | CREATE TABLE `uri` (
  type `userblacklist` (line 2322) | CREATE TABLE `userblacklist` (
  type `usr_preferences` (line 2349) | CREATE TABLE `usr_preferences` (
  type `version` (line 2380) | CREATE TABLE `version` (
  type `watchers` (line 2404) | CREATE TABLE `watchers` (
  type `xcap` (line 2434) | CREATE TABLE `xcap` (

FILE: testing/sql/v0.523+ent/kamailio.sql
  type `acc` (line 25) | CREATE TABLE `acc` (
  type `acc_cdrs` (line 63) | CREATE TABLE `acc_cdrs` (
  type `active_watchers` (line 89) | CREATE TABLE `active_watchers` (
  type `address` (line 142) | CREATE TABLE `address` (
  type `aliases` (line 170) | CREATE TABLE `aliases` (
  type `carrier_name` (line 217) | CREATE TABLE `carrier_name` (
  type `carrierfailureroute` (line 240) | CREATE TABLE `carrierfailureroute` (
  type `carrierroute` (line 271) | CREATE TABLE `carrierroute` (
  type `cdrs` (line 304) | CREATE TABLE `cdrs` (
  type `cpl` (line 342) | CREATE TABLE `cpl` (
  type `dbaliases` (line 369) | CREATE TABLE `dbaliases` (
  type `dialog` (line 398) | CREATE TABLE `dialog` (
  type `dialog_vars` (line 444) | CREATE TABLE `dialog_vars` (
  type `dialplan` (line 471) | CREATE TABLE `dialplan` (
  type `dispatcher` (line 501) | CREATE TABLE `dispatcher` (
  type `domain` (line 529) | CREATE TABLE `domain` (
  type `domain_attrs` (line 555) | CREATE TABLE `domain_attrs` (
  type `domain_name` (line 583) | CREATE TABLE `domain_name` (
  type `domainpolicy` (line 606) | CREATE TABLE `domainpolicy` (
  type `dr_custom_rules` (line 635) | CREATE TABLE `dr_custom_rules` (
  type `dr_gateways` (line 661) | CREATE TABLE `dr_gateways` (
  type `dr_groups` (line 744) | CREATE TABLE `dr_groups` (
  type `dr_gw_lists` (line 770) | CREATE TABLE `dr_gw_lists` (
  type `dr_rules` (line 902) | CREATE TABLE `dr_rules` (
  type `dsip_calllimit` (line 932) | CREATE TABLE `dsip_calllimit` (
  type `dsip_domain_mapping` (line 959) | CREATE TABLE `dsip_domain_mapping` (
  type `dsip_endpoint_lease` (line 986) | CREATE TABLE `dsip_endpoint_lease` (
  type `dsip_failfwd` (line 1011) | CREATE TABLE `dsip_failfwd` (
  type `dsip_gw2gwgroup` (line 1038) | CREATE TABLE `dsip_gw2gwgroup` (
  type `dsip_hardfwd` (line 1064) | CREATE TABLE `dsip_hardfwd` (
  type `dsip_lcr` (line 1091) | CREATE TABLE `dsip_lcr` (
  type `dsip_maintmode` (line 1119) | CREATE TABLE `dsip_maintmode` (
  type `dsip_multidomain_mapping` (line 1145) | CREATE TABLE `dsip_multidomain_mapping` (
  type `dsip_notification` (line 1179) | CREATE TABLE `dsip_notification` (
  type `dsip_settings` (line 1222) | CREATE TABLE `dsip_settings` (
  type `globalblacklist` (line 1251) | CREATE TABLE `globalblacklist` (
  type `grp` (line 1277) | CREATE TABLE `grp` (
  type `htable` (line 1304) | CREATE TABLE `htable` (
  type `imc_members` (line 1331) | CREATE TABLE `imc_members` (
  type `imc_rooms` (line 1358) | CREATE TABLE `imc_rooms` (
  type `lcr_gw` (line 1384) | CREATE TABLE `lcr_gw` (
  type `lcr_rule` (line 1420) | CREATE TABLE `lcr_rule` (
  type `lcr_rule_target` (line 1450) | CREATE TABLE `lcr_rule_target` (
  type `locale_lookup` (line 1479) | CREATE TABLE `locale_lookup` (
  type `location` (line 1504) | CREATE TABLE `location` (
  type `location_attrs` (line 1552) | CREATE TABLE `location_attrs` (
  type `missed_calls` (line 1583) | CREATE TABLE `missed_calls` (
  type `mohqcalls` (line 1613) | CREATE TABLE `mohqcalls` (
  type `mohqueues` (line 1642) | CREATE TABLE `mohqueues` (
  type `mtree` (line 1671) | CREATE TABLE `mtree` (
  type `mtrees` (line 1696) | CREATE TABLE `mtrees` (
  type `pdt` (line 1722) | CREATE TABLE `pdt` (
  type `pl_pipes` (line 1748) | CREATE TABLE `pl_pipes` (
  type `presentity` (line 1773) | CREATE TABLE `presentity` (
  type `pua` (line 1807) | CREATE TABLE `pua` (
  type `purplemap` (line 1852) | CREATE TABLE `purplemap` (
  type `re_grp` (line 1878) | CREATE TABLE `re_grp` (
  type `rls_presentity` (line 1903) | CREATE TABLE `rls_presentity` (
  type `rls_watchers` (line 1937) | CREATE TABLE `rls_watchers` (
  type `rtpengine` (line 1986) | CREATE TABLE `rtpengine` (
  type `rtpproxy` (line 2014) | CREATE TABLE `rtpproxy` (
  type `sca_subscriptions` (line 2041) | CREATE TABLE `sca_subscriptions` (
  type `silo` (line 2079) | CREATE TABLE `silo` (
  type `sip_trace` (line 2114) | CREATE TABLE `sip_trace` (
  type `speed_dial` (line 2152) | CREATE TABLE `speed_dial` (
  type `subscriber` (line 2183) | CREATE TABLE `subscriber` (
  type `topos_d` (line 2214) | CREATE TABLE `topos_d` (
  type `topos_t` (line 2263) | CREATE TABLE `topos_t` (
  type `trusted` (line 2313) | CREATE TABLE `trusted` (
  type `uacreg` (line 2342) | CREATE TABLE `uacreg` (
  type `uid_credentials` (line 2379) | CREATE TABLE `uid_credentials` (
  type `uid_domain` (line 2413) | CREATE TABLE `uid_domain` (
  type `uid_domain_attrs` (line 2440) | CREATE TABLE `uid_domain_attrs` (
  type `uid_global_attrs` (line 2469) | CREATE TABLE `uid_global_attrs` (
  type `uid_uri` (line 2496) | CREATE TABLE `uid_uri` (
  type `uid_uri_attrs` (line 2525) | CREATE TABLE `uid_uri_attrs` (
  type `uid_user_attrs` (line 2555) | CREATE TABLE `uid_user_attrs` (
  type `uri` (line 2583) | CREATE TABLE `uri` (
  type `userblacklist` (line 2610) | CREATE TABLE `userblacklist` (
  type `usr_preferences` (line 2637) | CREATE TABLE `usr_preferences` (
  type `version` (line 2668) | CREATE TABLE `version` (
  type `watchers` (line 2692) | CREATE TABLE `watchers` (
  type `xcap` (line 2722) | CREATE TABLE `xcap` (

FILE: testing/sql/v0.60+ent/kamailio.sql
  type `acc` (line 25) | CREATE TABLE `acc` (
  type `acc_cdrs` (line 63) | CREATE TABLE `acc_cdrs` (
  type `active_watchers` (line 89) | CREATE TABLE `active_watchers` (
  type `address` (line 142) | CREATE TABLE `address` (
  type `aliases` (line 170) | CREATE TABLE `aliases` (
  type `carrier_name` (line 217) | CREATE TABLE `carrier_name` (
  type `carrierfailureroute` (line 240) | CREATE TABLE `carrierfailureroute` (
  type `carrierroute` (line 271) | CREATE TABLE `carrierroute` (
  type `cdrs` (line 304) | CREATE TABLE `cdrs` (
  type `cpl` (line 342) | CREATE TABLE `cpl` (
  type `dbaliases` (line 369) | CREATE TABLE `dbaliases` (
  type `dialog` (line 398) | CREATE TABLE `dialog` (
  type `dialog_vars` (line 444) | CREATE TABLE `dialog_vars` (
  type `dialplan` (line 471) | CREATE TABLE `dialplan` (
  type `dispatcher` (line 501) | CREATE TABLE `dispatcher` (
  type `domain` (line 529) | CREATE TABLE `domain` (
  type `domain_attrs` (line 555) | CREATE TABLE `domain_attrs` (
  type `domain_name` (line 583) | CREATE TABLE `domain_name` (
  type `domainpolicy` (line 606) | CREATE TABLE `domainpolicy` (
  type `dr_gateways` (line 635) | CREATE TABLE `dr_gateways` (
  type `dr_groups` (line 664) | CREATE TABLE `dr_groups` (
  type `dr_gw_lists` (line 690) | CREATE TABLE `dr_gw_lists` (
  type `dr_rules` (line 819) | CREATE TABLE `dr_rules` (
  type `dsip_calllimit` (line 849) | CREATE TABLE `dsip_calllimit` (
  type `dsip_domain_mapping` (line 875) | CREATE TABLE `dsip_domain_mapping` (
  type `dsip_endpoint_lease` (line 902) | CREATE TABLE `dsip_endpoint_lease` (
  type `dsip_failfwd` (line 927) | CREATE TABLE `dsip_failfwd` (
  type `dsip_gw2gwgroup` (line 953) | CREATE TABLE `dsip_gw2gwgroup` (
  type `dsip_hardfwd` (line 979) | CREATE TABLE `dsip_hardfwd` (
  type `dsip_lcr` (line 1005) | CREATE TABLE `dsip_lcr` (
  type `dsip_maintmode` (line 1033) | CREATE TABLE `dsip_maintmode` (
  type `dsip_multidomain_mapping` (line 1059) | CREATE TABLE `dsip_multidomain_mapping` (
  type `dsip_notification` (line 1093) | CREATE TABLE `dsip_notification` (
  type `dsip_settings` (line 1135) | CREATE TABLE `dsip_settings` (
  type `globalblacklist` (line 1211) | CREATE TABLE `globalblacklist` (
  type `grp` (line 1237) | CREATE TABLE `grp` (
  type `htable` (line 1264) | CREATE TABLE `htable` (
  type `imc_members` (line 1291) | CREATE TABLE `imc_members` (
  type `imc_rooms` (line 1318) | CREATE TABLE `imc_rooms` (
  type `lcr_gw` (line 1344) | CREATE TABLE `lcr_gw` (
  type `lcr_rule` (line 1380) | CREATE TABLE `lcr_rule` (
  type `lcr_rule_target` (line 1410) | CREATE TABLE `lcr_rule_target` (
  type `locale_lookup` (line 1439) | CREATE TABLE `locale_lookup` (
  type `location` (line 1464) | CREATE TABLE `location` (
  type `location_attrs` (line 1512) | CREATE TABLE `location_attrs` (
  type `missed_calls` (line 1543) | CREATE TABLE `missed_calls` (
  type `mohqcalls` (line 1573) | CREATE TABLE `mohqcalls` (
  type `mohqueues` (line 1602) | CREATE TABLE `mohqueues` (
  type `mtree` (line 1631) | CREATE TABLE `mtree` (
  type `mtrees` (line 1656) | CREATE TABLE `mtrees` (
  type `pdt` (line 1682) | CREATE TABLE `pdt` (
  type `pl_pipes` (line 1708) | CREATE TABLE `pl_pipes` (
  type `presentity` (line 1733) | CREATE TABLE `presentity` (
  type `pua` (line 1767) | CREATE TABLE `pua` (
  type `purplemap` (line 1812) | CREATE TABLE `purplemap` (
  type `re_grp` (line 1838) | CREATE TABLE `re_grp` (
  type `rls_presentity` (line 1863) | CREATE TABLE `rls_presentity` (
  type `rls_watchers` (line 1897) | CREATE TABLE `rls_watchers` (
  type `rtpengine` (line 1946) | CREATE TABLE `rtpengine` (
  type `rtpproxy` (line 1974) | CREATE TABLE `rtpproxy` (
  type `sca_subscriptions` (line 2001) | CREATE TABLE `sca_subscriptions` (
  type `silo` (line 2039) | CREATE TABLE `silo` (
  type `sip_trace` (line 2074) | CREATE TABLE `sip_trace` (
  type `speed_dial` (line 2112) | CREATE TABLE `speed_dial` (
  type `subscriber` (line 2143) | CREATE TABLE `subscriber` (
  type `topos_d` (line 2174) | CREATE TABLE `topos_d` (
  type `topos_t` (line 2223) | CREATE TABLE `topos_t` (
  type `trusted` (line 2273) | CREATE TABLE `trusted` (
  type `uacreg` (line 2302) | CREATE TABLE `uacreg` (
  type `uid_credentials` (line 2339) | CREATE TABLE `uid_credentials` (
  type `uid_domain` (line 2373) | CREATE TABLE `uid_domain` (
  type `uid_domain_attrs` (line 2400) | CREATE TABLE `uid_domain_attrs` (
  type `uid_global_attrs` (line 2429) | CREATE TABLE `uid_global_attrs` (
  type `uid_uri` (line 2456) | CREATE TABLE `uid_uri` (
  type `uid_uri_attrs` (line 2485) | CREATE TABLE `uid_uri_attrs` (
  type `uid_user_attrs` (line 2515) | CREATE TABLE `uid_user_attrs` (
  type `uri` (line 2543) | CREATE TABLE `uri` (
  type `userblacklist` (line 2570) | CREATE TABLE `userblacklist` (
  type `usr_preferences` (line 2597) | CREATE TABLE `usr_preferences` (
  type `version` (line 2628) | CREATE TABLE `version` (
  type `watchers` (line 2652) | CREATE TABLE `watchers` (
  type `xcap` (line 2682) | CREATE TABLE `xcap` (
Condensed preview — 506 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,735K chars).
[
  {
    "path": ".github/FUNDING.yml",
    "chars": 133,
    "preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.md",
    "chars": 1319,
    "preview": "---\nname: Bug Report\nabout: Report unexpected program behavior to help us improve\ntitle: \"[BUG] Your Issue Name Here\"\nla"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 340,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: dSIPRouter Community Slack\n    url: https://dsiproutercommunity.sla"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE/default.md",
    "chars": 1296,
    "preview": "## Description\n\nInclude a summary of the changes and the related issue.  \nInclude relevant motivation and context.  \nLis"
  },
  {
    "path": ".gitignore",
    "chars": 462,
    "preview": "# dSIPRouter Project Specific Ignored Files\n.idea\n/resources/terraform/do/*.tfstate\n/resources/terraform/do/*.backup\n/re"
  },
  {
    "path": ".readthedocs.yml",
    "chars": 833,
    "preview": "# .readthedocs.yml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html fo"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 1442288,
    "preview": "[//]: # (START_SECTION HEADER)\n## CHANGELOG\n\n\n\n[//]: # (END_SECTION HEADER)\n[//]: # (START_SECTION COMMITS\n7c86d935be95d"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 5544,
    "preview": "# Contribution Guide\n\nThis guide will provide you with the tools to start developing on the dSIPRouter platform and cont"
  },
  {
    "path": "CONTRIBUTORS.md",
    "chars": 515,
    "preview": "## Thank you to all contributors for your hard work\n\n### Contributors\n\n- Asiel Lara\n- chelseatcarter\n- Dan\n- Dan Ryan\n- "
  },
  {
    "path": "HA/consul/consul.fc",
    "chars": 631,
    "preview": "/usr/local/bin/consul -- gen_context(system_u:object_r:consul_exec_t,s0)\n/usr/lib/systemd/system/consul.service -- gen_c"
  },
  {
    "path": "HA/consul/consul.hcl",
    "chars": 330,
    "preview": "datacenter = \"${CLUSTER_NAME}\"\ndata_dir = \"/opt/consul\"\nnode_name = \"NODE_NAME\"\nlog_level = \"INFO\"\nbind_addr = \"0.0.0.0\""
  },
  {
    "path": "HA/consul/consul.service",
    "chars": 673,
    "preview": "[Unit]\nDescription=\"HashiCorp Consul Service Mesh\"\nDocumentation=https://www.consul.io/\nRequires=network-online.target\nA"
  },
  {
    "path": "HA/consul/consul.te",
    "chars": 3229,
    "preview": "policy_module(consul, 1.0.0)\n\n########################################\n#\n# Declarations\n#\n\ntype consul_t;\ntype consul_ex"
  },
  {
    "path": "HA/consul/installConsulCluster.sh",
    "chars": 15454,
    "preview": "#!/usr/bin/env bash\n#\n# Summary:      consul service mesh\n# Supported OS: debian, ubuntu, linuxmint, redhat, centos, ama"
  },
  {
    "path": "HA/consul/server.hcl",
    "chars": 55,
    "preview": "server = true\nbootstrap_expect = ${NUM_NODES}\nui = true"
  },
  {
    "path": "HA/mysql/installAAGaleraReplication.sh",
    "chars": 34979,
    "preview": "#!/usr/bin/env bash\n#\n# Summary:      mysql active active galera replication\n#\n# Supported OS: debian, centos, amzn\n#\n# "
  },
  {
    "path": "HA/mysql/installAAGroupReplication.sh",
    "chars": 7373,
    "preview": "#!/usr/bin/env bash\n#\n# Summary:      mysql active active group replication\n# Supported OS: debian\n# Author:       DevOp"
  },
  {
    "path": "HA/pacemaker/AWS/ocf-floatip",
    "chars": 10050,
    "preview": "#!/bin/sh\n#\n#\n# Manage Elastic IP with Pacemaker\n#\n#\n# Copyright 2016-2018 guessi <guessi@gmail.com>\n# Copyright 2024 Ty"
  },
  {
    "path": "HA/pacemaker/DO/assign-ip",
    "chars": 908,
    "preview": "#!/usr/bin/env bash\n\n# derived from http://do.co/ocf-floatip\n\napi_base='https://api.digitalocean.com/v2'\n\n\nusage() {\n   "
  },
  {
    "path": "HA/pacemaker/DO/ocf-floatip",
    "chars": 1880,
    "preview": "#!/bin/bash\n\n# derived from http://do.co/ocf-floatip\n\nparam=$1\n\nexport DO_TOKEN=$OCF_RESKEY_do_token\nIP=$OCF_RESKEY_floa"
  },
  {
    "path": "HA/pacemaker/installKamCluster.sh",
    "chars": 16695,
    "preview": "#!/usr/bin/env bash\n#\n# Summary:  corosync / pacemaker kamailio cluster config\n#\n# Notes:    more than 2 nodes may requi"
  },
  {
    "path": "HA/pacemaker/nodeutil.sh",
    "chars": 3895,
    "preview": "#!/usr/bin/env bash\n#\n# Summary: Utility functions for managing cluster nodes\n# Summary: Program should be run locally o"
  },
  {
    "path": "HA/pacemaker/scripts/stage1.sh",
    "chars": 7604,
    "preview": "#!/bin/bash\n\n# import runtime environment\nif ! [[ -f \"$1\" ]] || ! source \"$1\"; then\n   echo \"Could not import runtime en"
  },
  {
    "path": "HA/pacemaker/scripts/stage2.sh",
    "chars": 3749,
    "preview": "#!/bin/bash\n\n# import runtime environment\nif ! [[ -f \"$1\" ]] || ! source \"$1\"; then\n   echo \"Could not import runtime en"
  },
  {
    "path": "HA/pacemaker/scripts/stage3.sh",
    "chars": 7998,
    "preview": "#!/bin/bash\n\n# import runtime environment\nif ! [[ -f \"$1\" ]] || ! source \"$1\"; then\n   echo \"Could not import runtime en"
  },
  {
    "path": "HA/shared_lib.sh",
    "chars": 24109,
    "preview": "#!/usr/bin/env bash\n#\n# NOTES:\n# contains utility functions and shared variables\n# should be sourced by an external scri"
  },
  {
    "path": "Jenkinsfile",
    "chars": 687,
    "preview": "pipeline {\n  parameters {\n    password (name: 'DIGITALOCEAN_TOKEN')\n  }\n  environment {\n    TF_WORKSPACE = 'dev' //Sets "
  },
  {
    "path": "Jenkinsfile.common",
    "chars": 848,
    "preview": "gitlabBuilds(builds: ['build', 'test', 'artifacts']) {\n\n  stage('build') { gitlabCommitStatus(name: 'build') {\n    sh \"."
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 4437,
    "preview": "# dSIPRouter Platform\n\n\n[<p align=\"center\"><img src=\"docs/dsiprouter_300px.png\" alt=\"dSIPRouter Logo\" width=\"300\"/></p>]"
  },
  {
    "path": "cloud/build_image.sh",
    "chars": 2562,
    "preview": "#!/usr/bin/env bash\n#\n# Summary:  build dsiprouter as an VM/VPS Deployable Image\n# Usage:    ./build_image.sh [--ver='<d"
  },
  {
    "path": "cloud/build_instance.sh",
    "chars": 2462,
    "preview": "#!/usr/bin/env bash\n#\n# Summary:  build dsiprouter as an VM/VPS Instance\n# Usage:    ./build_instance.sh [--ver='<dsipro"
  },
  {
    "path": "cloud/cloud-init/configs/AWS.cfg",
    "chars": 299,
    "preview": "datasource_list: [ Ec2, NoCloud, None ]\ndisable_root: true\nssh_pwauth: false\nssh_deletekeys: true\nssh_genkeytypes: [rsa,"
  },
  {
    "path": "cloud/cloud-init/configs/AZURE.cfg",
    "chars": 301,
    "preview": "datasource_list: [ Azure, NoCloud, None ]\ndisable_root: true\nssh_pwauth: false\nssh_deletekeys: true\nssh_genkeytypes: [rs"
  },
  {
    "path": "cloud/cloud-init/configs/DO.cfg",
    "chars": 322,
    "preview": "datasource_list: [ ConfigDrive, DigitalOcean, NoCloud, None ]\ndisable_root: false\nssh_pwauth: false\nssh_deletekeys: true"
  },
  {
    "path": "cloud/cloud-init/configs/GCE.cfg",
    "chars": 316,
    "preview": "datasource_list: datasource_list: [ GCE, NoCloud, None ]\ndisable_root: true\nssh_pwauth: false\nssh_deletekeys: true\nssh_g"
  },
  {
    "path": "cloud/cloud-init/configs/VULTR.cfg",
    "chars": 301,
    "preview": "datasource_list: [ Vultr, NoCloud, None ]\ndisable_root: true\nssh_pwauth: false\nssh_deletekeys: true\nssh_genkeytypes: [rs"
  },
  {
    "path": "cloud/cloud-init/templates/hosts.almalinux.tmpl",
    "chars": 1010,
    "preview": "## template:jinja\n{#\nThis file /etc/cloud/templates/hosts.redhat.tmpl is only utilized\nif enabled in cloud-config.  Spec"
  },
  {
    "path": "cloud/cloud-init/templates/hosts.amzn.tmpl",
    "chars": 1010,
    "preview": "## template:jinja\n{#\nThis file /etc/cloud/templates/hosts.redhat.tmpl is only utilized\nif enabled in cloud-config.  Spec"
  },
  {
    "path": "cloud/cloud-init/templates/hosts.centos.tmpl",
    "chars": 1010,
    "preview": "## template:jinja\n{#\nThis file /etc/cloud/templates/hosts.redhat.tmpl is only utilized\nif enabled in cloud-config.  Spec"
  },
  {
    "path": "cloud/cloud-init/templates/hosts.debian.tmpl",
    "chars": 1000,
    "preview": "## template:jinja\n{#\nThis file (/etc/cloud/templates/hosts.debian.tmpl) is only utilized\nif enabled in cloud-config.  Sp"
  },
  {
    "path": "cloud/cloud-init/templates/hosts.rhel.tmpl",
    "chars": 1010,
    "preview": "## template:jinja\n{#\nThis file /etc/cloud/templates/hosts.redhat.tmpl is only utilized\nif enabled in cloud-config.  Spec"
  },
  {
    "path": "cloud/cloud-init/templates/hosts.rocky.tmpl",
    "chars": 1010,
    "preview": "## template:jinja\n{#\nThis file /etc/cloud/templates/hosts.redhat.tmpl is only utilized\nif enabled in cloud-config.  Spec"
  },
  {
    "path": "cloud/cloud-init/templates/hosts.ubuntu.tmpl",
    "chars": 1000,
    "preview": "## template:jinja\n{#\nThis file (/etc/cloud/templates/hosts.debian.tmpl) is only utilized\nif enabled in cloud-config.  Sp"
  },
  {
    "path": "cloud/find_hosts_tmpl.sh",
    "chars": 1139,
    "preview": "#!/usr/bin/env bash\n#\n# Summary: find the correct hosts template for the current environment\n#\n\ncase \"$(cloud-init query"
  },
  {
    "path": "cloud/pre-snapshot.sh",
    "chars": 7387,
    "preview": "#!/usr/bin/env bash\n#\n# Summary: clean up / harden system before creating an image\n#\n\nfunction cmdExists() {\n    if comm"
  },
  {
    "path": "dnsmasq/almalinux/install.sh",
    "chars": 1295,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dnsmasq/amzn/install.sh",
    "chars": 2961,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dnsmasq/centos/install.sh",
    "chars": 3115,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dnsmasq/configs/dnsmasq_sh.conf",
    "chars": 27937,
    "preview": "# Configuration file for dnsmasq.\n#\n# Format is one option per line, legal options are the same\n# as the long options le"
  },
  {
    "path": "dnsmasq/configs/ifupdown/default.conf",
    "chars": 1029,
    "preview": "# Configuration for networking init script being run during\n# the boot sequence\n\n# Set to 'no' to skip interfaces config"
  },
  {
    "path": "dnsmasq/configs/ifupdown/networking-pre.sh",
    "chars": 998,
    "preview": "#!/bin/sh\n\nmkdir -p /run/network/\nrm -f /run/network/ifupdown.conf 2>/dev/null\n\n# check whether nmcli reports that netwo"
  },
  {
    "path": "dnsmasq/configs/ifupdown/override.conf",
    "chars": 314,
    "preview": "[Unit]\nAfter=systemd-networkd.service\n\n[Service]\nEnvironmentFile=-/run/network/ifupdown.conf\nExecStartPre=/usr/lib/ifupd"
  },
  {
    "path": "dnsmasq/configs/networkmanager/dsiprouter.conf",
    "chars": 772,
    "preview": "# dSIPRouter does not utilize the NetworkManager dnsmasq plugin.\n# Instead DNSmasq is managed as a separate service that"
  },
  {
    "path": "dnsmasq/configs/networkmanager/wait-override.conf",
    "chars": 55,
    "preview": "[Service]\nEnvironment=\nEnvironment=NM_ONLINE_TIMEOUT=30"
  },
  {
    "path": "dnsmasq/configs/resolv.conf",
    "chars": 509,
    "preview": "# DNS servers are being managed by dSIPRouter dynamically, DO NOT CHANGE THIS FILE\n#\n# The DNSmasq stub resolver will ha"
  },
  {
    "path": "dnsmasq/configs/resolvconf_def",
    "chars": 76,
    "preview": "REPORT_ABSENT_SYMLINK=no\nTRUNCATE_NAMESERVER_LIST_AFTER_LOOPBACK_ADDRESS=yes"
  },
  {
    "path": "dnsmasq/configs/resolvconf_upd",
    "chars": 2537,
    "preview": "#!/bin/sh\n#\n# Script to update the resolver list for dnsmasq\n#\n# N.B. Resolvconf may run us even if dnsmasq is not (yet)"
  },
  {
    "path": "dnsmasq/configs/systemdnetworkd/docker.network",
    "chars": 42,
    "preview": "[Match]\nName=docker*\n\n[Link]\nUnmanaged=yes"
  },
  {
    "path": "dnsmasq/configs/systemdnetworkd/dsiprouter.network",
    "chars": 54,
    "preview": "[Match]\nName=*\n\n[Network]\nDHCP=yes\n\n[DHCP]\nUseDNS=true"
  },
  {
    "path": "dnsmasq/configs/systemdnetworkd/networkd-pre.sh",
    "chars": 637,
    "preview": "#!/bin/sh\n\nmkdir -p /run/systemd/network/\nrm -f /run/systemd/network/00-nm_managed-*.network 2>/dev/null\n\n# check whethe"
  },
  {
    "path": "dnsmasq/configs/systemdnetworkd/override.conf",
    "chars": 90,
    "preview": "[Unit]\nAfter=NetworkManager.service\n\n[Service]\nExecStartPre=!/usr/lib/systemd/networkd-pre"
  },
  {
    "path": "dnsmasq/configs/systemdnetworkd/wait-override.conf",
    "chars": 74,
    "preview": "[Service]\nExecStart=/lib/systemd/systemd-networkd-wait-online --timeout=30"
  },
  {
    "path": "dnsmasq/configs/systemdresolved/dsiprouter.conf",
    "chars": 100,
    "preview": "[Resolve]\nMulticastDNS=no\nLLMNR=no\nCache=no\nCacheFromLocalhost=no\nDNSStubListener=no\nReadEtcHosts=no"
  },
  {
    "path": "dnsmasq/debian/12.sh",
    "chars": 3798,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dnsmasq/debian/install.sh",
    "chars": 11182,
    "preview": "#!/usr/bin/env bash\n#\n# dSIPRouter DNS Resolution - How it Works\n#\n# Many of the cluster features require a multiple IP "
  },
  {
    "path": "dnsmasq/init.d/dnsmasq",
    "chars": 9672,
    "preview": "#!/bin/sh\n### BEGIN INIT INFO\n# Provides:       dnsmasq\n# Required-Start: $network $remote_fs $syslog\n# Required-Stop:  "
  },
  {
    "path": "dnsmasq/rhel/install.sh",
    "chars": 1295,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dnsmasq/rocky/install.sh",
    "chars": 1295,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dnsmasq/systemd/dnsmasq-v1.service",
    "chars": 1170,
    "preview": "[Unit]\nDescription=dnsmasq - A lightweight DHCP and caching DNS server\nRequires=basic.target network.target\nAfter=networ"
  },
  {
    "path": "dnsmasq/systemd/dnsmasq-v2.service",
    "chars": 552,
    "preview": "[Unit]\nDescription=dnsmasq - A lightweight DHCP and caching DNS server\nRequires=basic.target network.target\nAfter=networ"
  },
  {
    "path": "dnsmasq/systemd/dnsmasq-v3.service",
    "chars": 576,
    "preview": "[Unit]\nDescription=dnsmasq - A lightweight DHCP and caching DNS server\nRequires=basic.target network.target\nAfter=networ"
  },
  {
    "path": "dnsmasq/ubuntu/install.sh",
    "chars": 1921,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "docker/dsiprouter/dockerfile",
    "chars": 325,
    "preview": "# Dockerfile\nFROM python:3.6-stretch\n\nMAINTAINER Mack Hendricks <mack@dsiprouter.org>\n\nCOPY ./  /opt/dsiprouter/\nWORKDIR"
  },
  {
    "path": "docker/dsiprouter/wait-for-dsiprouter-mysql.sh",
    "chars": 264,
    "preview": "#!/bin/sh\n# wait-for-dsiprouter-mysql.sh\n\nset -e\n\nhost=\"$1\"\nshift\ncmd=\"$@\"\n\nuntil python ./gui/dsiprouter.py runserver; "
  },
  {
    "path": "docker/mysql/dockerfile",
    "chars": 316,
    "preview": "# Dockerfile\nFROM python:3.6-stretch\n\nMAINTAINER Mack Hendricks <mack@dsiprouter.org>\n\nCOPY ../../  /opt/dsiprouter/\nWOR"
  },
  {
    "path": "docker-compose.yml",
    "chars": 1121,
    "preview": "version: '3'\nservices:\n  dsiprouter:\n    build: \n      context: .\n      dockerfile: docker/dsiprouter/dockerfile\n    ima"
  },
  {
    "path": "docs/Makefile",
    "chars": 885,
    "preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHI"
  },
  {
    "path": "docs/requirements.in",
    "chars": 128,
    "preview": "docutils<0.17,>=0.12\nmyst-parser\nrecommonmark\nrequests\nsphinx\nsphinxcontrib-httpdomain\nsphinx-rtd-theme\npiccolo_theme\nUl"
  },
  {
    "path": "docs/requirements.txt",
    "chars": 2046,
    "preview": "#\n# This file is autogenerated by pip-compile with Python 3.8\n# by the following command:\n#\n#    pip-compile --strip-ext"
  },
  {
    "path": "docs/source/_static/placeholder",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/source/_templates/placeholder",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/source/conf.py",
    "chars": 5875,
    "preview": "# -*- coding: utf-8 -*-\n#\n# Configuration file for the Sphinx documentation builder.\n#\n# This file does only contain a s"
  },
  {
    "path": "docs/source/dev/database.rst",
    "chars": 118,
    "preview": "database\n========\n\n.. automodule:: database\n   :members:\n   :undoc-members:\n   :private-members:\n   :special-members:\n"
  },
  {
    "path": "docs/source/dev/dsiprouter.rst",
    "chars": 124,
    "preview": "dsiprouter\n==========\n\n.. automodule:: dsiprouter\n   :members:\n   :undoc-members:\n   :private-members:\n   :special-membe"
  },
  {
    "path": "docs/source/dev/index.rst",
    "chars": 724,
    "preview": "Developer Hub\n=============\n\nPython Modules\n--------------\n\nThe dSIPRouter project at its core is a WSGI Flask applicati"
  },
  {
    "path": "docs/source/dev/modules.rst",
    "chars": 1256,
    "preview": "=======\nmodules\n=======\n\nmodules.api.api_routes\n======================\n\n.. automodule:: modules.api.api_routes\n   :membe"
  },
  {
    "path": "docs/source/dev/settings.rst",
    "chars": 118,
    "preview": "settings\n========\n\n.. automodule:: settings\n   :members:\n   :undoc-members:\n   :private-members:\n   :special-members:\n"
  },
  {
    "path": "docs/source/dev/shared.rst",
    "chars": 112,
    "preview": "shared\n======\n\n.. automodule:: shared\n   :members:\n   :undoc-members:\n   :private-members:\n   :special-members:\n"
  },
  {
    "path": "docs/source/dev/sysloginit.rst",
    "chars": 124,
    "preview": "sysloginit\n==========\n\n.. automodule:: sysloginit\n   :members:\n   :undoc-members:\n   :private-members:\n   :special-membe"
  },
  {
    "path": "docs/source/dev/util.rst",
    "chars": 1796,
    "preview": "====\nutil\n====\n\nutil.conversions\n================\n\n.. automodule:: util.conversions\n   :members:\n   :undoc-members:\n   :"
  },
  {
    "path": "docs/source/index.rst",
    "chars": 563,
    "preview": "dSIPRouter Docs\n===============\n\nThere are 3 main sections of documentation:\n\n1. User Documentation\n2. Developer Documen"
  },
  {
    "path": "docs/source/routes/details.rst",
    "chars": 108,
    "preview": "Route Details\n=============\n\n.. autoflask:: dsiprouter:app\n    :undoc-static:\n    :include-empty-docstring:\n"
  },
  {
    "path": "docs/source/routes/index.rst",
    "chars": 319,
    "preview": "GUI/API Routes\n==============\n\nThe GUI and API make several routes accessible for usage.\nA summary and description of ea"
  },
  {
    "path": "docs/source/routes/summary.rst",
    "chars": 673,
    "preview": "Route Summary\n=============\n\n.. raw:: html\n\n    <style>div.document > div.documentwrapper {max-width: fit-content;}</sty"
  },
  {
    "path": "docs/source/user/api.rst",
    "chars": 1575,
    "preview": "dSIPRouter API Intro\n====================\n\nThe complete API is defined as a public Postman Workspace, which can be found"
  },
  {
    "path": "docs/source/user/carrier_groups.rst",
    "chars": 2776,
    "preview": ".. _carrier_groups:\n\nCarrier Groups\n^^^^^^^^^^^^^^\n\nThe Carrier Group section of dSIPRouter allows you to define which c"
  },
  {
    "path": "docs/source/user/command_line_options.rst",
    "chars": 2484,
    "preview": "Command Line Options\n====================\n\nExecute \"./dsiprouter.sh\" followed by one of the listed commands.\n**NOTE** On"
  },
  {
    "path": "docs/source/user/conf.py",
    "chars": 5845,
    "preview": "# -*- coding: utf-8 -*-\n#\n# Configuration file for the Sphinx documentation builder.\n#\n# This file does only contain a s"
  },
  {
    "path": "docs/source/user/configuring.rst",
    "chars": 190,
    "preview": "dSIPRouter GUI Intro\n====================\n\n.. toctree::\n  :maxdepth: 3\n\n  carrier_groups.rst\n  pbxs_and_endpoints.rst\n  "
  },
  {
    "path": "docs/source/user/debian_install.rst",
    "chars": 1819,
    "preview": ".. _debian_install:\n\nInstalling on a Debian-based Distro\n===================================\n\nFor a specific version of "
  },
  {
    "path": "docs/source/user/domains.rst",
    "chars": 1589,
    "preview": "Adding a Domain\n^^^^^^^^^^^^^^^\n\nTo add a domain click on Domains then click the green add button.\n\n.. image:: images/ad"
  },
  {
    "path": "docs/source/user/global_outbound_routes.rst",
    "chars": 595,
    "preview": "\n.. _global_outbound_routes:\n\nGlobal Outbound Routes\n^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n\n1) Go to the Dashboard screen.\n\n\n\n.. im"
  },
  {
    "path": "docs/source/user/images/DID_test.csv",
    "chars": 39,
    "preview": "13134860409\r\n13134860410\r\n13134860411\r\n"
  },
  {
    "path": "docs/source/user/inbound_did_mapping.rst",
    "chars": 1562,
    "preview": "Inbound DID Mapping\n======================\n\n\n\nTo Import a DID from a CSV file:\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n\n1) Cli"
  },
  {
    "path": "docs/source/user/index.rst",
    "chars": 2566,
    "preview": "The dSIPRouter Project\n======================\n\n.. raw:: html\n\n    <h2>Intro to dSIPRouter</h2>\n\ndSIPRouter allows you to"
  },
  {
    "path": "docs/source/user/installing.rst",
    "chars": 2843,
    "preview": ".. _installing_dsiprouter:\n\nInstalling dSIPRouter\n=====================\n\nThe following video shows you the install proce"
  },
  {
    "path": "docs/source/user/pbxs_and_endpoints.rst",
    "chars": 1425,
    "preview": "PBX(s) and Endpoints\n======================\n\n\n\nAllows you to define a PBX or Endpoint that will send or receive calls fr"
  },
  {
    "path": "docs/source/user/resources.rst",
    "chars": 711,
    "preview": "Extra Resources\n===============\n\nUploading CSVs\n--------------\n\n`CSV Example <https://raw.githubusercontent.com/dOpensou"
  },
  {
    "path": "docs/source/user/rhel_install.rst",
    "chars": 1720,
    "preview": ".. _rhel_install:\n\nInstalling on a RHEL-based Distro\n=================================\n\nFor a specific version of dSIPRo"
  },
  {
    "path": "docs/source/user/supported_configurations.rst",
    "chars": 1552,
    "preview": ".. _supported_configurations\n\nSupported Configurations\n========================\n\nPass Thru to PBX Authentication Support"
  },
  {
    "path": "docs/source/user/troubleshooting.rst",
    "chars": 3337,
    "preview": "Troubleshooting\n===============\n\nHere you can troubleshoot logs for dSIPRouter, Kamailio and rtpengine:\n\nAll of our serv"
  },
  {
    "path": "docs/source/user/upgrade_0.50_to_0.51.rst",
    "chars": 1675,
    "preview": "In this section we will show you how to upgrade from 0.50 to 0.51.\n\nBefore starting the upgrade process you will need to"
  },
  {
    "path": "docs/source/user/upgrade_0.522_to_0.523.rst",
    "chars": 1757,
    "preview": "In this section we will show you how to upgrade from 0.522 to 0.523.\n\nBefore starting the upgrade process you will need "
  },
  {
    "path": "docs/source/user/upgrade_0.621_to_0.63.rst",
    "chars": 424,
    "preview": "In this section we will show you how to upgrade from 0.621 to 0.63.  This is the first release\nto contain our new upgrad"
  },
  {
    "path": "docs/source/user/upgrading.rst",
    "chars": 5056,
    "preview": ".. _upgrading:\n\nUpgrading dSIPRouter\n====================\n\nAuto Upgrade Feature\n--------------------\n\nThe dSIPRouter aut"
  },
  {
    "path": "docs/source/user/use-cases.rst",
    "chars": 23354,
    "preview": "Common Use Cases\n================\n\nThis section contains a list of the common use cases that are implemented using dSIPR"
  },
  {
    "path": "dsiprouter/almalinux/8.sh",
    "chars": 4835,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/almalinux/9.sh",
    "chars": 4431,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/amzn/2.sh",
    "chars": 6739,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/centos/7.sh",
    "chars": 5604,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/centos/8.sh",
    "chars": 5604,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/centos/9.sh",
    "chars": 4431,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/debian/10.sh",
    "chars": 5153,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/debian/11.sh",
    "chars": 4839,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/debian/12.sh",
    "chars": 4850,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/debian/9.sh",
    "chars": 5178,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/dsip-net-cfg.py",
    "chars": 4082,
    "preview": "#!/usr/bin/env python3\n#\n# Handle any network configurations that need setup prior to the dSIPRouter services starting\n#"
  },
  {
    "path": "dsiprouter/dsip_completion.sh",
    "chars": 4636,
    "preview": "#!/usr/bin/env bash\n\n#####################################\n# dsiprouter command completion\n#############################"
  },
  {
    "path": "dsiprouter/dsip_lib.sh",
    "chars": 49566,
    "preview": "# NOTES:\n# contains utility functions and shared variables\n# should be sourced by an external script\n# exporting upon im"
  },
  {
    "path": "dsiprouter/pbkdf2.sh",
    "chars": 1300,
    "preview": "#!/usr/bin/env bash\n\n# Inspired By: https://gist.github.com/grondilu/abe50de34f6c838dbc9388fe797ea4e4\n# Credit to: https"
  },
  {
    "path": "dsiprouter/rhel/8.sh",
    "chars": 4889,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/rhel/9.sh",
    "chars": 4583,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/rocky/8.sh",
    "chars": 4864,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/rocky/9.sh",
    "chars": 4431,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/sudoers.d/99-dsiprouter",
    "chars": 558,
    "preview": "Cmnd_Alias DSIP_UPGRADE_CMDS = /usr/bin/dsiprouter upgrade, /usr/bin/dsiprouter upgrade *\nCmnd_Alias DSIP_RESTART_CMDS ="
  },
  {
    "path": "dsiprouter/systemd/dsiprouter-v1.service",
    "chars": 1351,
    "preview": "# Utilzing Type=simple while main process is still single threaded\n# Main process is managed via signals from systemd (s"
  },
  {
    "path": "dsiprouter/systemd/dsiprouter-v2.service",
    "chars": 1428,
    "preview": "# Utilzing Type=simple while main process is still single threaded\n# Main process is managed via signals from systemd (s"
  },
  {
    "path": "dsiprouter/ubuntu/20.sh",
    "chars": 4989,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/ubuntu/22.sh",
    "chars": 4615,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter/ubuntu/24.sh",
    "chars": 4737,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# Import dsip_lib utility / share"
  },
  {
    "path": "dsiprouter.sh",
    "chars": 218853,
    "preview": "#!/usr/bin/env bash\n#\n#=============== dSIPRouter Management Script ==============#\n#\n# install, configure, and manage d"
  },
  {
    "path": "gui/database/__init__.py",
    "chars": 35322,
    "preview": "# make sure the generated source files are imported instead of the template ones\nimport sys\n\nif sys.path[0] != '/etc/dsi"
  },
  {
    "path": "gui/dsiprouter.py",
    "chars": 102053,
    "preview": "#!/opt/dsiprouter/venv/bin/python\n\n# make sure the generated source files are imported instead of the template ones\nimpo"
  },
  {
    "path": "gui/dsiprouter_cron.py",
    "chars": 1352,
    "preview": "#!/opt/dsiprouter/venv/bin/python\n#\n# summary:\n#   dsiprouter cronjob interface script\n# usage:\n#   /opt/dsiprouter/gui/"
  },
  {
    "path": "gui/dsiprouter_ut.py",
    "chars": 359,
    "preview": "import unittest\nfrom modules.domain.domain_service import *\n\nclass TestUnit(unittest.TestCase):\n\n    def setUp(self):\n  "
  },
  {
    "path": "gui/modules/api/api.sql",
    "chars": 667,
    "preview": "DROP TABLE IF EXISTS `dsip_endpoint_lease`;\nCREATE TABLE `dsip_endpoint_lease` (\n\t  `id` int(10) unsigned NOT NULL AUTO_"
  },
  {
    "path": "gui/modules/api/api_functions.py",
    "chars": 4615,
    "preview": "# make sure the generated source files are imported instead of the template ones\nimport sys\n\nif sys.path[0] != '/etc/dsi"
  },
  {
    "path": "gui/modules/api/api_routes.py",
    "chars": 134269,
    "preview": "# make sure the generated source files are imported instead of the template ones\nimport sys\n\nif sys.path[0] != '/etc/dsi"
  },
  {
    "path": "gui/modules/api/auth/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "gui/modules/api/auth/functions.py",
    "chars": 1722,
    "preview": "from shared import debugException, debugEndpoint, stripDictVals, showError\nfrom database import startSession, DummySessi"
  },
  {
    "path": "gui/modules/api/auth/ldap/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "gui/modules/api/auth/ldap/interface.py",
    "chars": 3142,
    "preview": "import sys\n\nif sys.path[0] != '/etc/dsiprouter/gui':\n    sys.path.insert(0, '/etc/dsiprouter/gui')\n\nimport ldap\nimport s"
  },
  {
    "path": "gui/modules/api/auth/routes.py",
    "chars": 10838,
    "preview": "# make sure the generated source files are imported instead of the template ones\nimport sys\n\nif sys.path[0] != '/etc/dsi"
  },
  {
    "path": "gui/modules/api/carriergroups/functions.py",
    "chars": 20275,
    "preview": "import json, sys\nfrom flask import request, session, redirect, url_for, render_template\nfrom sqlalchemy import exc as sq"
  },
  {
    "path": "gui/modules/api/carriergroups/plugin/twilio/carrier_plugintype_version.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "gui/modules/api/carriergroups/plugin/twilio/interface.py",
    "chars": 2395,
    "preview": "import os\nfrom twilio.rest import Client\n\n# Metadata about plugin\nplugin_version = 1.0\nplugin_name = \"twilio\"\ndefault_tw"
  },
  {
    "path": "gui/modules/api/carriergroups/routes.py",
    "chars": 8698,
    "preview": "import sys, os, importlib.util\n# make sure the generated source files are imported instead of the template ones\nif sys.p"
  },
  {
    "path": "gui/modules/api/cron_functions.py",
    "chars": 897,
    "preview": "from datetime import datetime\nfrom shared import debugException\nfrom database import startSession, DummySession, Subscri"
  },
  {
    "path": "gui/modules/api/install.sh",
    "chars": 1988,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# ENABLED=1 --> install, ENABLED="
  },
  {
    "path": "gui/modules/api/kamailio/errors.py",
    "chars": 377,
    "preview": "class KamailioError(Exception):\n    \"\"\"\n    There was an error communicating with Kamailio\n    \"\"\"\n\n    def __init__(sel"
  },
  {
    "path": "gui/modules/api/kamailio/functions.py",
    "chars": 8655,
    "preview": "import requests, sys\nfrom time import sleep, time\nfrom typing import Union\nfrom werkzeug import exceptions as http_excep"
  },
  {
    "path": "gui/modules/api/licensemanager/classes.py",
    "chars": 9135,
    "preview": "import sys\n\nif sys.path[0] != '/etc/dsiprouter/gui':\n    sys.path.insert(0, '/etc/dsiprouter/gui')\n\nimport requests, sec"
  },
  {
    "path": "gui/modules/api/licensemanager/cli.py",
    "chars": 7771,
    "preview": "# TODO: this is an ugly implementation but better than inline python in the shell script\n#       marked for refactoring "
  },
  {
    "path": "gui/modules/api/licensemanager/functions.py",
    "chars": 7457,
    "preview": "import sys\n\nif sys.path[0] != '/etc/dsiprouter/gui':\n    sys.path.insert(0, '/etc/dsiprouter/gui')\n\nfrom database import"
  },
  {
    "path": "gui/modules/api/licensemanager/routes.py",
    "chars": 13106,
    "preview": "import sys\n\nif sys.path[0] != '/etc/dsiprouter/gui':\n    sys.path.insert(0, '/etc/dsiprouter/gui')\n\nfrom flask import Bl"
  },
  {
    "path": "gui/modules/api/mediaserver/plugin/fusion/interface.py",
    "chars": 15668,
    "preview": "# FusionPBX Plugin for the Media Server api\nimport psycopg2\nimport psycopg2.extras\nimport json\nimport uuid\n\n\n# Defining "
  },
  {
    "path": "gui/modules/api/mediaserver/plugin/fusionpbx",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "gui/modules/api/mediaserver/routes.py",
    "chars": 22098,
    "preview": "import importlib.util, os\nfrom flask import Blueprint, jsonify\nfrom database import startSession, DummySession, dSIPMult"
  },
  {
    "path": "gui/modules/api/sample_api.py",
    "chars": 524,
    "preview": "from flask import Blueprint\nfrom modules.api.api_functions import api_security\n\n\nnew_api = Blueprint('new_api','__name__"
  },
  {
    "path": "gui/modules/cdr/cdrs.sql",
    "chars": 8709,
    "preview": "-- MySQL dump 10.14  Distrib 5.5.52-MariaDB, for Linux (x86_64)\n--\n-- Host: localhost    Database: kamailio\n-- ---------"
  },
  {
    "path": "gui/modules/cdr/cron_functions.py",
    "chars": 698,
    "preview": "from datetime import datetime\nfrom shared import debugException\nfrom database import startSession, DummySession, dSIPCDR"
  },
  {
    "path": "gui/modules/cdr/install.sh",
    "chars": 1809,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# ENABLED=1 --> install, ENABLED="
  },
  {
    "path": "gui/modules/certificates/certificates.sql",
    "chars": 277,
    "preview": "DROP TABLE IF EXISTS `dsip_certificates`; \nCREATE TABLE IF NOT EXISTS `dsip_certificates` (\n  `id` INT NOT NULL AUTO_INC"
  },
  {
    "path": "gui/modules/certificates/install.sh",
    "chars": 1655,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# ENABLED=1 --> install, ENABLED="
  },
  {
    "path": "gui/modules/custom_routing/custom_routing.sql",
    "chars": 2492,
    "preview": "-- MySQL dump 10.13  Distrib 5.5.59, for debian-linux-gnu (x86_64)\n--\n-- Host: localhost    Database: kamailio\n-- ------"
  },
  {
    "path": "gui/modules/custom_routing/install.sh",
    "chars": 1634,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# ENABLED=1 --> install, ENABLED="
  },
  {
    "path": "gui/modules/dnid_enrichment/dnid_enrichment.sql",
    "chars": 938,
    "preview": "DROP TABLE IF EXISTS dsip_dnid_enrich_lnp;\n/*!40101 SET @saved_cs_client = @@character_set_client */;\n/*!40101 SET chara"
  },
  {
    "path": "gui/modules/dnid_enrichment/install.sh",
    "chars": 1754,
    "preview": "# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# ENABLED=1 --> install, ENABLED=0 --> do nothing, ENA"
  },
  {
    "path": "gui/modules/domain/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "gui/modules/domain/domain_mapping.sql",
    "chars": 2921,
    "preview": "-- MySQL dump 10.16  Distrib 10.1.26-MariaDB, for debian-linux-gnu (x86_64)\n--\n-- Host: localhost    Database: kamailio\n"
  },
  {
    "path": "gui/modules/domain/domain_routes.py",
    "chars": 16401,
    "preview": "import sys\n\nif sys.path[0] != '/etc/dsiprouter/gui':\n    sys.path.insert(0, '/etc/dsiprouter/gui')\n\nimport re\nfrom flask"
  },
  {
    "path": "gui/modules/domain/install.sh",
    "chars": 1611,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# ENABLED=1 --> install, ENABLED="
  },
  {
    "path": "gui/modules/flowroute/__init__.py",
    "chars": 1447,
    "preview": "import requests\nimport settings\n\n# TODO: automate route setup and ip auth config in flowroute\n\nclass Numbers():\n    \"\"\"\n"
  },
  {
    "path": "gui/modules/frauddetection/fraud.py",
    "chars": 1417,
    "preview": "import sys\nfrom pyspark.sql import SQLContext\nfrom pyspark.sql import SparkSession\nfrom pyspark.ml.linalg import DenseVe"
  },
  {
    "path": "gui/modules/frauddetection/install.sh",
    "chars": 726,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# ENABLED=1 --> install, ENABLED="
  },
  {
    "path": "gui/modules/fusionpbx/dsiprouter-provisioner.conf",
    "chars": 956,
    "preview": "upstream fusionpbx {\n\tserver fusionpbx5.dsiprouter.net:443;\n\n}\n\n\n# handle the https requests\nserver {\n    # by default w"
  },
  {
    "path": "gui/modules/fusionpbx/dsiprouter-provisioner.tpl",
    "chars": 1010,
    "preview": "upstream fusionpbx {\n\t##SERVERLIST##\n}\n\n\n# handle the https requests\nserver {\n    # by default we listen on all interfac"
  },
  {
    "path": "gui/modules/fusionpbx/dsiprouter.nginx",
    "chars": 596,
    "preview": "    upstream fusionpbx {\n\tserver fusionpbx5.dsiprouter.net:443;\n  \n  }\n\n\n    server {\n        listen 80;\n        listen "
  },
  {
    "path": "gui/modules/fusionpbx/dsiprouter.nginx.tpl",
    "chars": 572,
    "preview": "    upstream fusionpbx {\n\t##SERVERLIST##  \n  }\n\n\n    server {\n        listen 80;\n        listen 443 ssl;\n\n        ssl_ce"
  },
  {
    "path": "gui/modules/fusionpbx/fusionpbx_sync_functions.py",
    "chars": 18257,
    "preview": "import os, psycopg2, hashlib, MySQLdb, shutil\nfrom util.security import AES_CTR\nfrom util.networking import safeUriToHos"
  },
  {
    "path": "gui/modules/fusionpbx/html/images/placeholder.txt",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "gui/modules/fusionpbx/install.sh",
    "chars": 6178,
    "preview": "#!/usr/bin/env bash\n\n# Debug this script if in debug mode\n(( $DEBUG == 1 )) && set -x\n\n# ENABLED=1 --> install, ENABLED="
  },
  {
    "path": "gui/modules/upgrade/__init__.py",
    "chars": 875,
    "preview": "import re, requests\n\nimport settings\n\n\nclass UpdateUtils():\n    @staticmethod\n    def get_repo_version_list():\n        h"
  },
  {
    "path": "gui/requirements.txt",
    "chars": 421,
    "preview": "UltraDict\nacme\nansi2html\nbjoern\nbson\ncron_descriptor\ncryptography\ndnspython\ndocker\ndocutils<0.17,>=0.12\nFlask~=2.2.0\nFla"
  },
  {
    "path": "gui/settings.py",
    "chars": 7945,
    "preview": "################ Database-Backed Settings ################\n# settings in this section are synced with the DB\n\n# dSIPRout"
  },
  {
    "path": "gui/shared.py",
    "chars": 20614,
    "preview": "# make sure the generated source files are imported instead of the template ones\nimport sys\nif sys.path[0] != '/etc/dsip"
  },
  {
    "path": "gui/static/css/bootstrap-theme.css",
    "chars": 26132,
    "preview": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "gui/static/css/bootstrap-toggle.css",
    "chars": 1819,
    "preview": "/*! ========================================================================\n * Bootstrap Toggle: bootstrap-toggle.css v"
  },
  {
    "path": "gui/static/css/bootstrap.css",
    "chars": 146010,
    "preview": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://gi"
  }
]

// ... and 306 more files (download for full content)

About this extraction

This page contains the full source code of the dOpensource/dsiprouter GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 506 files (5.2 MB), approximately 1.4M tokens, and a symbol index with 1051 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!