Tuesday, January 06, 2026

IT‘S A KIND Of MAGIC: THE WIZARDRY OF LLAMA.CPP

 



In the grand theater of artificial intelligence, where billion-parameter language models perform their computational ballet, there exists a backstage hero that rarely gets the applause it deserves. This unsung protagonist is llama.cpp, a masterpiece of engineering elegance that transforms mammoth language models from GPU-hungry beasts into CPU-friendly companions capable of running on your grandmother’s laptop.


THE GENESIS OF A COMPUTATIONAL REVOLUTION


Picture this: It’s March 2023, and Georgi Gerganov, the Bulgarian wizard of low-level programming, stares at his screen contemplating a seemingly impossible challenge. How do you take Facebook’s LLaMA model, a computational titan that normally demands enterprise-grade hardware, and make it dance on consumer devices? The answer came in the form of pure C/C++ magic, creating what would become one of the most significant democratization efforts in AI history.

Gerganov wasn’t new to this game. He had already proven his mettle with whisper.cpp, transforming OpenAI’s Whisper speech recognition model into a lightweight, dependency-free powerhouse. But llama.cpp would be his magnum opus, built atop his earlier creation: the GGML tensor library, whose name cleverly combines his initials (GG) with Machine Learning (ML).

The story begins in September 2022, when Gerganov started developing GGML, inspired by the legendary Fabrice Bellard’s LibNC work. GGML wasn’t just another tensor library; it was designed with strict memory management and multi-threading as core principles, setting the foundation for what would become the most efficient LLM inference engine on the planet.


THE ARCHITECTURAL SYMPHONY


At its heart, llama.cpp follows a elegantly simple yet profoundly powerful architectural pattern. The system operates on a two-tier structure: GGML provides the low-level tensor computation engine, while llama.cpp serves as the model-specific frontend that understands the intricacies of transformer architectures.

The magic begins with initialization. When you fire up llama.cpp, it reads a GGUF file using the llama_init_from_file function. This isn’t your ordinary file reading operation - it’s a carefully orchestrated process that parses both the header containing metadata and the body containing the actual model weights. The system then creates a llama context object, which serves as the central nervous system for all subsequent operations.

What makes this architecture particularly brilliant is its backend-agnostic design. The GGML layer abstracts away the complexity of different hardware accelerations, supporting an impressive array of backends: CPU (the trusty default), CUDA for NVIDIA GPUs, Metal for Apple Silicon, OpenCL for diverse graphics cards, Vulkan for cross-platform GPU acceleration, and even exotic options like SYCL for Intel GPUs and MUSA for Moore Threads hardware.

The computational graph model lies at the core of GGML’s efficiency. Operations are defined as nodes in a directed acyclic graph, then executed by backend-specific implementations. This approach allows for sophisticated optimizations, including operation fusion and memory layout optimizations that squeeze every ounce of performance from the available hardware.


THE GGUF REVOLUTION: FROM CHAOS TO ORDER


Before August 2023, the world of model formats was fragmented and frustrating. Researchers and practitioners dealt with separate tokenizer files, model weights, and configuration parameters scattered across multiple files. Then came GGUF (GGML Universal File format), and suddenly everything changed.

GGUF represents a paradigm shift in how we think about model distribution. Unlike its predecessor GGML format, GGUF consolidates everything into a single, self-contained file. The tokenizer, model weights, metadata, architecture information, and even special tokens - all live together in harmonious unity. This isn’t just convenient; it’s revolutionary for deployment scenarios where simplicity and reliability matter.

The format’s binary structure is a marvel of engineering efficiency. The header contains a magic number for format identification, followed by version information and metadata arrays. Each tensor is described with its name, dimensions, data type, and offset within the tensor data block. This structure enables lightning-fast loading and memory mapping, crucial for responsive user experiences.

But the real genius lies in GGUF’s extensibility. Unlike the old GGML format, which often broke compatibility when new features were added, GGUF was designed from the ground up to handle evolution gracefully. New metadata fields can be added without breaking existing implementations, ensuring that today’s models will work with tomorrow’s software.


QUANTIZATION: THE ART OF DIGITAL COMPRESSION


If GGUF is the elegant file format, quantization is the secret sauce that makes llama.cpp truly magical. In the world of large language models, precision is often the enemy of practicality. Neural networks trained with 32-bit floating point precision require enormous amounts of memory and computational resources. Quantization solves this by strategically reducing precision while preserving model quality.

The quantization zoo in llama.cpp is both extensive and sophisticated. At the conservative end, you have Q8_0, which uses 8-bit integers and preserves nearly all the original model quality while cutting memory usage in half. Moving down the spectrum, Q5_K_M provides an excellent balance of quality and efficiency, making it the go-to choice for many practitioners.

The “K” quantization variants represent a particularly clever innovation. Instead of applying uniform quantization across all weights, these methods use different quantization levels for different types of weights. For example, Q4_K_M uses Q6_K quantization for half of the attention and feed-forward weights (the most critical components) while applying Q4_K to the rest. This selective approach preserves model quality where it matters most while achieving significant compression.

At the extreme end, you have experimental formats like IQ2_XXS and IQ2_XS, which push the boundaries of how much you can compress a model while maintaining reasonable performance. These use advanced techniques like importance-weighted quantization and non-linear quantization functions to achieve compression ratios that seemed impossible just a few years ago.

The quantization process itself is a careful dance of statistical analysis. The system analyzes weight distributions, identifies outliers, and applies block-wise scaling to minimize quantization error. Modern variants even use calibration datasets to identify the most important weights, ensuring they receive preferential treatment during the quantization process.


HARDWARE HARMONY: OPTIMIZATION ACROSS THE SPECTRUM


One of llama.cpp’s most impressive achievements is its hardware agnosticism without sacrificing performance. The system leverages platform-specific optimizations while maintaining a unified codebase, a feat that would make any systems programmer weep with joy.

On x86 architectures, llama.cpp exploits the full range of SIMD extensions: AVX, AVX2, and AVX-512 for modern processors, with automatic detection and runtime selection of the best available instruction set. These vector instructions allow the processor to perform multiple operations simultaneously, dramatically accelerating matrix operations that form the backbone of neural network inference.

Apple Silicon receives first-class treatment, leveraging ARM NEON instructions and the Accelerate framework for optimal performance. The Metal backend taps into Apple’s GPU architecture, allowing MacBook Airs and Mac Studios to run substantial language models with remarkable efficiency. This focus on Apple hardware has been crucial for democratizing AI among creative professionals and researchers who prefer macOS environments.

The CUDA backend for NVIDIA GPUs is perhaps the most sophisticated, featuring custom kernels optimized for the specific characteristics of transformer models. These kernels handle operations like attention computation and matrix multiplication with surgical precision, extracting maximum performance from expensive GPU hardware.

But the real magic happens in hybrid scenarios. llama.cpp supports partial offloading, where some model layers run on the GPU while others execute on the CPU. This capability is crucial for situations where the model is too large to fit entirely in GPU memory, allowing users to achieve significant acceleration even with limited VRAM.


THE MULTIMODAL FRONTIER


In April 2025, llama.cpp received a significant boost with the introduction of libmtmd, which reinvigorated support for multimodal models. This development marked a new chapter in the project’s evolution, expanding beyond text-only language models to encompass vision-language models and other multimodal architectures.

The multimodal support isn’t just an afterthought; it’s a carefully engineered extension that maintains the same principles of efficiency and hardware optimization that made llama.cpp famous. Vision encoders, text decoders, and cross-modal attention mechanisms all benefit from the same quantization techniques and hardware acceleration that power text-only models.

This capability opens doors to applications that were previously impossible on consumer hardware: image captioning, visual question answering, and document analysis can now run locally without sending sensitive data to cloud services. The privacy implications alone make this a game-changing development.


PERFORMANCE ENGINEERING: THE DEVIL IN THE DETAILS


What separates llama.cpp from academic proof-of-concept implementations is its obsessive attention to performance engineering. Every aspect of the system has been optimized for real-world usage scenarios.

Memory management follows a zero-allocation principle during runtime. All memory is pre-allocated during initialization, eliminating garbage collection pauses and memory fragmentation issues that plague other implementations. This approach ensures consistent, predictable performance even during long inference sessions.

The key-value cache management deserves special mention. In transformer models, attention mechanisms generate key and value vectors that can be reused across generation steps. llama.cpp implements sophisticated caching strategies that minimize recomputation while managing memory usage carefully. The system even supports on-the-fly KV cache quantization, allowing users to trade slight quality reductions for substantial memory savings.

Thread-level parallelism is another area where llama.cpp shines. The system automatically detects the optimal number of threads for the available hardware and workload characteristics. On multi-core systems, matrix operations are distributed across cores with careful attention to memory bandwidth limitations and cache hierarchy effects.


THE ECOSYSTEM EXPLOSION


Perhaps the most remarkable aspect of llama.cpp’s success is how it has spawned an entire ecosystem of tools and applications. Projects like Ollama, Jan AI , LM Studio, and GPT4All all build upon llama.cpp’s foundation, adding user-friendly interfaces and specialized features while benefiting from the core engine’s efficiency.

The OpenAI-compatible API endpoints provided by llama-server have been particularly influential. This compatibility layer allows existing applications built for OpenAI’s API to work seamlessly with local models, enabling a smooth transition from cloud-based to local inference. The implications for privacy, cost control, and offline operation are profound.

The server component includes sophisticated features like request queuing, parallel inference for multiple users, and template-based chat formatting. These capabilities transform llama.cpp from a research tool into a production-ready inference server suitable for real applications.


CHALLENGES AND FUTURE HORIZONS


Despite its remarkable success, llama.cpp faces ongoing challenges that reflect the broader difficulties in AI systems engineering. Hardware fragmentation remains a persistent issue, with different GPU architectures requiring specialized optimization strategies. The recent issues with NVIDIA’s RTX 5070 GPU architecture support highlight these challenges, as emerging hardware often outpaces software adaptation cycles.

Model architecture diversity presents another challenge. While llama.cpp began with a focus on LLaMA-style transformers, the AI research community continues to develop new architectures with different computational characteristics. Supporting these emerging architectures while maintaining the system’s performance and simplicity requires careful engineering trade-offs.

The quantization landscape continues to evolve, with new techniques like AQLM (Additive Quantization for Language Models) pushing the boundaries of model compression. Integrating these advanced quantization methods while maintaining backward compatibility and reasonable compilation complexity presents ongoing challenges.

Looking toward the future, several trends will likely shape llama.cpp’s evolution. The growing importance of mixture-of-experts (MoE) architectures requires new optimization strategies, as these models have different memory access patterns and computational characteristics compared to traditional transformers. The recent success with models like DeepSeek-V3 demonstrates both the potential and the challenges of supporting these architectures efficiently.

Edge deployment scenarios continue to drive innovation. As AI capabilities move into mobile devices, embedded systems, and edge computing platforms, the demand for even greater efficiency will intensify. This trend favors llama.cpp’s design philosophy of minimal dependencies and careful resource management.


THE DEMOCRATIC REVOLUTION


Beyond its technical achievements, llama.cpp represents something more profound: the democratization of artificial intelligence. Before its emergence, running state-of-the-art language models required expensive cloud computing resources or specialized hardware configurations. llama.cpp changed this equation fundamentally, making powerful AI accessible to researchers, students, and enthusiasts worldwide.

This democratization has had cascading effects throughout the AI ecosystem. Small companies can now experiment with AI applications without massive infrastructure investments. Researchers in developing countries can access cutting-edge models without prohibitive cloud computing costs. Privacy-conscious users can run AI assistants entirely offline, keeping their data local and secure.

The educational impact cannot be overstated. Students learning about AI can now run and experiment with real language models on their personal computers, gaining hands-on experience that was previously limited to well-funded institutions. This accessibility has accelerated AI education and research across diverse communities.


PERFORMANCE DEEP DIVE: BENCHMARKS AND REAL-WORLD SPEEDS


To truly understand llama.cpp’s impact, we must examine its performance across different hardware configurations and use cases. The project maintains extensive benchmark databases that reveal fascinating insights into the relationship between hardware, quantization, and inference speed.

On Apple Silicon, the results are particularly impressive. An M1 Ultra with its 800 GB/s memory bandwidth can achieve around 33.92 tokens per second with LLaMA-2 7B in FP16 precision, while Q4_0 quantization pushes this to similar speeds with dramatically reduced memory usage. The M2 Ultra, despite having slightly less memory bandwidth than an NVIDIA RTX 4090, can compete effectively due to its unified memory architecture where CPU and GPU share the same memory pool.

The memory bandwidth bottleneck becomes particularly evident in token generation, which is fundamentally memory-bound rather than compute-bound. This explains why an RTX 4090, despite having vastly superior compute power compared to Apple Silicon, only achieves 1.5-1.67x better token generation speeds while being 7x faster in compute-heavy operations like prompt processing. This phenomenon, eloquently described by Andrej Karpathy, means that powerful GPUs often spend more time waiting for their cache to fill than performing actual computations during single-token generation.

Recent benchmarks on AMD Ryzen AI 300 series processors show the growing importance of integrated GPU acceleration. With Vulkan-based GPU offloading, the AMD Ryzen AI 9 HX 375 achieves 31% performance increases for small models like Meta Llama 3.2 1B, though larger bandwidth-bound models see more modest 5.1% improvements. This demonstrates the nuanced relationship between model size, memory bandwidth, and acceleration effectiveness.

CPU-only performance remains surprisingly competitive, especially on high-end processors with large caches. The AMD Threadripper 7995WX with its massive 384MB L3 cache can achieve remarkable speeds, nearly matching Apple Silicon despite consuming significantly more power. Intel’s latest processors with

AVX-512 support show similar benefits, with bfloat16 operations receiving particular optimization attention through specialized VDPBF16PS instructions.


THE SERVER REVOLUTION: OPENAI COMPATIBILITY AND PRODUCTION DEPLOYMENT


The llama-server component represents one of llama.cpp’s most transformative features, transforming the project from a research tool into a production-ready inference platform. The OpenAI-compatible API endpoints have created a seamless bridge between local and cloud-based AI deployment, allowing applications built for OpenAI’s API to work without modification on local hardware.

This compatibility layer supports the full range of OpenAI endpoints, including /v1/chat/completions for conversational AI, /v1/completions for text completion, and even specialized features like function calling and structured JSON output.

The server supports both streaming and non-streaming responses, with streaming implemented through server-sent events that provide real-time token generation updates to clients.


The architectural sophistication of llama-server becomes apparent when examining its concurrency handling. The system supports parallel inference for multiple users through sophisticated request batching and scheduling algorithms. The -np parameter allows processing multiple requests simultaneously, with context windows automatically divided among concurrent sessions. This enables scenarios where development tools like Cline or Continue can make multiple simultaneous requests for code completion and chat functionality.

Configuration management follows enterprise-grade principles, with JSON-based config files supporting multiple models, custom chat templates, and fine-grained performance tuning. Environment variables provide deployment-friendly configuration options, while command-line parameters enable rapid experimentation and testing.

The server’s grammar-based output formatting deserves special mention. Users can specify GBNF (GGML Backus-Naur Form) grammars to constrain model output to specific formats, enabling reliable JSON generation, programming language syntax, or custom structured data formats. This capability bridges the gap between the probabilistic nature of language models and the deterministic requirements of structured applications.


MEMORY MANAGEMENT MASTERY: KV CACHE OPTIMIZATION AND BEYOND


Perhaps no aspect of llama.cpp demonstrates its engineering sophistication more clearly than its memory management strategies, particularly around the key-value (KV) cache. The KV cache stores attention keys and values from previous tokens, enabling efficient sequential generation without recomputing past contexts. However, this optimization comes with significant memory costs that scale with sequence length and batch size.

For a concrete example, consider LLaMA-3 70B processing a 128k token context. The KV cache alone consumes approximately 40GB of memory for a single user, and this scales linearly with batch size. Processing 32 concurrent sequences would require over 1.2TB of memory just for the KV cache, clearly exceeding any current GPU capability. This mathematical reality drives many of llama.cpp’s most sophisticated optimizations.

The system implements several ingenious strategies to manage this challenge. Partial offloading allows critical attention layers to remain in fast GPU memory while less frequently accessed data moves to system RAM. Dynamic layer loading can swap model layers between CPU and GPU memory during computation, using PCIe bandwidth to overcome VRAM limitations.

On-the-fly KV cache quantization represents a cutting-edge optimization where the precision of cached attention values reduces dynamically during inference. Early research suggests that 4-bit KV cache quantization can reduce memory usage by 75% while maintaining generation quality comparable to full precision. This technique, pioneered in projects like ExLlamaV2, shows particular promise for enabling larger context windows on consumer hardware.

The cache management system also implements sophisticated eviction strategies. When memory pressure occurs, the system can selectively remove less important KV entries based on attention patterns and usage frequency. This approach, similar to least-recently-used (LRU) caching policies, maintains performance for frequently accessed tokens while freeing memory for new content.


ADVANCED INFERENCE TECHNIQUES: SPECULATIVE DECODING AND BEYOND


Speculative decoding represents one of the most promising frontiers for accelerating llama.cpp inference. This technique uses a smaller, faster “draft” model to predict multiple tokens ahead, which are then validated in parallel by the main “target” model. When predictions prove accurate, the system achieves significant speedups by processing multiple tokens per inference step.

The implementation challenges are considerable. Both draft and target models must maintain synchronized KV caches, requiring careful memory management and computational coordination. The draft model typically runs 10x faster than the target model, making the speculation overhead negligible when predictions succeed. However, the technique’s effectiveness varies dramatically across different model architectures and tasks.

Recent deployments show impressive results with appropriate model pairings. DeepSeek-R1 32B paired with a 1.5B draft model can achieve near-reference benchmark scores while running significantly faster than standard autoregressive decoding. The key lies in selecting draft models that capture the target model’s distribution patterns without introducing excessive computational overhead. Tree-based speculation extends this concept further, generating multiple potential continuation paths simultaneously. This approach particularly benefits tasks with high uncertainty, where multiple valid completions exist. However, the memory overhead grows exponentially with tree depth, requiring careful balancing between speculation breadth and resource consumption.


COMMUNITY ECOSYSTEM: THE RIPPLE EFFECTS OF OPEN INNOVATION


The llama.cpp ecosystem extends far beyond the core project, spawning dozens of derivative tools and applications that leverage its foundational capabilities. Ollama provides a Docker-like interface for managing local models, abstracting away the complexity of quantization and configuration while maintaining llama.cpp’s performance benefits. Jan offers a sleek desktop interface that makes local AI accessible to non-technical users, while LM Studio provides comprehensive model management and fine-tuning capabilities.

The Open WebUI project creates a ChatGPT-like interface that can seamlessly switch between local llama.cpp instances and cloud providers, enabling hybrid deployment strategies. GPT4All takes a different approach, bundling llama.cpp with curated model collections and simplified installation procedures for maximum accessibility.

These projects demonstrate the network effects of open-source innovation. By providing a stable, performant foundation, llama.cpp enables higher-level applications to focus on user experience and specialized functionality rather than rebuilding inference engines from scratch. This layered approach accelerates innovation across the entire ecosystem.

The educational impact cannot be overstated. Universities worldwide use llama.cpp to teach AI engineering concepts, allowing students to experiment with production-scale models on modest hardware. Researchers in resource-constrained environments can conduct meaningful experiments without cloud computing budgets, democratizing access to cutting-edge AI capabilities.


HARDWARE EVOLUTION: ADAPTING TO THE CHANGING LANDSCAPE


As hardware architectures evolve, llama.cpp continuously adapts to extract maximum performance from emerging platforms. The recent challenges with NVIDIA’s RTX 5070 GPU architecture illustrate both the opportunities and complications of this rapid evolution. New hardware often introduces architectural changes that require specialized kernel optimizations, driver updates, and sometimes fundamental algorithmic modifications.

Intel’s discrete GPU offerings through the Arc series present interesting optimization challenges. The SYCL backend enables GPU acceleration on Intel hardware, though performance characteristics differ significantly from NVIDIA’s CUDA architecture. Memory bandwidth, cache hierarchies, and instruction throughput all require specialized attention to achieve optimal performance.

AMD’s RDNA architecture receives support through both the HIP backend (for compatibility with CUDA-style programming) and OpenCL implementations. The challenge lies in adapting algorithms designed for NVIDIA’s tensor core architecture to AMD’s different computational units and memory subsystems.

Mobile and embedded deployment scenarios drive different optimization priorities. ARM processors in smartphones and edge devices prioritize power efficiency over raw performance, requiring careful balancing of computational intensity and battery life. The Qualcomm Snapdragon X series and Apple Silicon provide interesting case studies in how unified memory architectures can benefit AI workloads even in power-constrained environments.


LOOKING FORWARD: THE NEXT FRONTIER OF OPTIMIZATION


The future of llama.cpp development centers on several key technological trends that will define the next generation of AI inference systems. Mixture-of-experts (MoE) architectures present both opportunities and challenges, with models like DeepSeek-V3 demonstrating how expert routing can achieve larger effective parameter counts while maintaining reasonable computational requirements.

The advent of 1-bit and sub-1-bit quantization techniques pushes the boundaries of model compression. Recent experiments with 1.56-bit quantization suggest that extreme compression may be possible while maintaining reasonable generation quality. These techniques require fundamental rethinking of computational kernels and memory access patterns.

Memory hierarchy optimization becomes increasingly critical as context windows expand toward millions of tokens. Hierarchical attention mechanisms and compressed context representations offer potential solutions, but implementation complexity grows substantially. The challenge lies in maintaining the semantic coherence that makes long-context models useful while managing the computational and memory scaling challenges.

Quantum computing’s eventual maturation may provide completely different optimization paradigms, though practical applications remain years in the future. More immediately, optical computing and neuromorphic architectures may offer specialized acceleration opportunities for specific AI workloads.


CONCLUSION: THE CONTINUING JOURNEY


As we look at the landscape of artificial intelligence in 2025, llama.cpp stands as a testament to the power of thoughtful engineering and community collaboration. What began as one programmer’s quest to make LLaMA models more accessible has evolved into a foundational technology that powers thousands of applications and enables millions of users to harness the power of large language models.

The project’s success reflects deeper principles that extend beyond AI: the importance of open source development, the power of performance optimization, and the transformative potential of making advanced technology accessible to broader communities. In an era where AI development often seems concentrated among a few large corporations, llama.cpp represents a different path - one where innovation emerges from passionate individuals and collaborative communities.

The technical achievements chronicled in this exploration - from GGUF’s elegant file format to sophisticated quantization algorithms, from hardware-specific optimizations to advanced inference techniques - represent hundreds of person-years of careful engineering. Each optimization builds upon previous work while enabling new capabilities, creating a compound effect that has fundamentally changed how we think about AI deployment.

The performance benchmarks reveal llama.cpp’s remarkable versatility. Whether running on an M1 MacBook Air, a high-end Threadripper workstation, or a cloud-based GPU cluster, the system adapts its strategies to extract maximum performance from available hardware. This adaptability ensures relevance across diverse deployment scenarios, from edge computing to enterprise data centers.

The server architecture and OpenAI compatibility features transform llama.cpp from a research tool into a production platform capable of supporting real-world applications. The seamless integration with existing AI toolchains reduces barriers to adoption while providing the performance and cost benefits of local deployment.

Perhaps most importantly, llama.cpp demonstrates that sophisticated technology need not be complex or inaccessible. The zero-dependency design philosophy, comprehensive documentation, and active community support make advanced AI inference techniques available to anyone with curiosity and determination.

The future of llama.cpp will undoubtedly bring new challenges and opportunities. As AI models grow larger and more sophisticated, the need for efficient inference engines will only increase. As new hardware architectures emerge, the demand for flexible, optimized software will intensify. Through it all, llama.cpp’s core philosophy of simplicity, efficiency, and accessibility will continue to guide its evolution.

For those who have never delved into the intricate world of AI systems engineering, llama.cpp offers a masterclass in how thoughtful design and obsessive optimization can create something truly transformative. For veterans of the field, it serves as a reminder that sometimes the most profound innovations come not from adding complexity, but from stripping it away to reveal the essential elegance beneath.

In the end, llama.cpp is more than just a software project - it’s a bridge between the cutting edge of AI research and the practical needs of real-world applications. As this bridge continues to strengthen and expand, it promises to carry us toward a future where artificial intelligence truly serves everyone, not just those with the deepest pockets or most powerful hardware.

The wizard behind the curtain continues his work, and the magic of making AI accessible to all shows no signs of slowing down. In laboratories and bedrooms, in startups and Fortune 500 companies, in classrooms and research institutes around the world, llama.cpp quietly powers the next generation of AI applications that are reshaping how we work, learn, and create.

The story of llama.cpp is ultimately a story about human ingenuity: how one person’s vision, amplified by a global community of contributors, can democratize access to transformative technology. As we stand on the threshold of even more capable AI systems, the principles and practices pioneered by llama.cpp will continue to light the way forward, ensuring that the benefits of artificial intelligence remain within reach of all who seek to use them.

No comments: